Announcement

Collapse
No announcement yet.

JScrollPane erzeugt keine Scrollbalken bei übergroßen Textinhalt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • JScrollPane erzeugt keine Scrollbalken bei übergroßen Textinhalt

    Hallo,

    ich versuche gerade mit dem folgenden Code das JScrollPane "licenseScroll" scrollbar zu machen. In diesem wird der GNU Lizenz-Text eingfügt - ein langer Text, der eigentlich
    ein automatisches Scrollen von JScrollPane auslösen sollte.
    Code:
    licenseScroll.setAutoscrolls(true);
    und das Weglassen beiden Policies hilft leider nichts. Die JScrollPane will einfach keine Scrollbalken anzeigen.

    Code:
    package com.company.workingdays;
    
    import javax.swing.*;
    import javax.swing.border.EmptyBorder;
    import javax.swing.border.TitledBorder;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.URL;
    
    public class AboutFrame extends JFrame {
        private JButton closeButton = new JButton("Schliessen");
        /**
         * Create the form of AboutFrame
         */
        public AboutFrame() {
            initComponents();
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            setLocationRelativeTo(getOwner());
            setSize(510, 350);
            setResizable(false);
            setTitle("Über WorkingDays");
        }
    
        /**
         * ActionListeners of the form
         */
        private void closeButtonActionPerformed(ActionEvent evt) {
            Container frame = closeButton.getParent();
            do {
                frame = frame.getParent();
            } while (!(frame instanceof JFrame));
            ((JFrame) frame).dispose();
        }
    
        /**
         * Components of the form
         */
        private void initComponents() {
            /* Declaration and initialization of the variables */
            JPanel contentPane = new JPanel();
            JEditorPane aboutPane = new JEditorPane();
            JEditorPane licensePane = new JEditorPane();
            JScrollPane licenseScroll = new JScrollPane();
            StringBuffer buffer = new StringBuffer();
            /* End of declaration and initialization of the variables */
    
            /* Create the resources from Jar file */
    
            URL url = getClass().getResource("/resources/about.html");
            InputStream input = getClass().getResourceAsStream("/resources/license");
            InputStreamReader inputReader = new InputStreamReader(input);
    
            try {
                int len;
                while ((len = inputReader.read()) != -1) {
                    buffer.append((char) len);
                }
                inputReader.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            setContentPane(contentPane);
    
            contentPane.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
            try {
                aboutPane.setPage(url);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            aboutPane.setPreferredSize(new Dimension(490, 120));
            aboutPane.setEditable(false);
            contentPane.add(aboutPane);
            licensePane.setPreferredSize(new Dimension(490, 120));
            licensePane.setEditable(false);
            licensePane.setContentType("text/plain");
            licensePane.setText(buffer.toString());
            licenseScroll.setBorder(new TitledBorder(null, "Lizenz-Vereinbarung",
                    TitledBorder.LEADING, TitledBorder.DEFAULT_POSITION,
                    new Font("Dialog", Font.PLAIN, 12), Color.blue));
            licenseScroll.setViewportView(licensePane);
            //licenseScroll.setAutoscrolls(true);
            licenseScroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
            licenseScroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            contentPane.add(licenseScroll);
            closeButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent evt) {
                    closeButtonActionPerformed(evt);
                }
            });
            contentPane.add(closeButton);
            pack();
        }
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            /* Create and display the form */
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        AboutFrame frame = new AboutFrame();
                        frame.setVisible(true);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            });
        }
    }
    Sieht hier jemand, was ich vergessen habe oder falsch mache?

    Besten Dank,

    Wambui

  • #2
    Habe das mal entkernt und auf das Wesentliche beschränkt:

    [highlight=java]
    JEditorPane licensePane=new JEditorPane();
    JScrollPane licenseScroll=new JScrollPane();
    StringBuffer buffer=new StringBuffer();
    for(int i=0;i<5000;i++)
    {
    buffer.append("awdadada"+"\n");
    }
    licensePane.setPreferredSize(new Dimension(490,120));
    licensePane.setEditable(false);
    licensePane.setContentType("text/plain");
    licensePane.setText(buffer.toString());

    licenseScroll.setViewportView(licensePane);
    licenseScroll.setBorder(new TitledBorder(null,"Lizenz-Vereinbarung",
    TitledBorder.LEADING,TitledBorder.DEFAULT_POSITION ,
    new Font("Dialog",Font.PLAIN,12),Color.blue));

    licenseScroll.setVerticalScrollBarPolicy(ScrollPan eConstants.VERTICAL_SCROLLBAR_ALWAYS);
    licenseScroll.setHorizontalScrollBarPolicy(ScrollP aneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

    add(licenseScroll);
    pack();
    [/highlight]

    Die Scrollpane muss dem JFrame (oder das Panel dem JFrame) zugeordnet werden und nicht einem Panel, welches

    setContentPane(contentPane);

    der ContentPane zugewiesen wird
    Christian

    Comment


    • #3
      Originally posted by Christian Marquardt View Post

      Die Scrollpane muss dem JFrame (oder das Panel dem JFrame) zugeordnet werden und nicht einem Panel, welches

      setContentPane(contentPane);

      der ContentPane zugewiesen wird
      Gibt es dafür eine Begründung? Wie wirkt sich das auf die JScrollPane aus? Bzw. warum wird dadurch die JScrollPane beeinflusst?

      Gruß

      Wambui

      Comment


      • #4
        add(contentPane) könnte bei dir funktionieren
        Christian

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          add(contentPane) könnte bei dir funktionieren
          Das bringt mich total durcheinander. Meinst Du
          add(contentPane)
          anstelle von
          setContentPane(contentPane); ?

          Das bewirkt keine Änderung bzgl. der JScrollPane.
          Ich verstehe auch nicht, warum JScrollPane dem JFrame zugeordnet sein soll undn icht dem JPanel "contentPane". Letzteres lege ich ja an, damit ich den Panel ein Layout geben kann, auf dem die Komponeten angeordnet werden können.
          Ich sollte schon wissen warum Du etwas empfiehlst. Es macht keinen Sinn etwas auszuführen, ohne den Hintergrund verstanden zu haben.

          Wambui

          Comment


          • #6
            Du kannst es dem JPanel zuordnen. Jedoch muss der ganze Stapel mal irgendwann per add() dem JFrame zugewiesen werden. Es ist nicht erforderlich, ein JPanel dazwischen zu schieben. Dem JFrame kann ein Layout zugewiesen werden.
            Vielleicht mal einen visuellen Editor https://netbeans.org/features/java-on-client/swing.html ausprobieren
            Christian

            Comment


            • #7
              Besten Dank für die Information.
              Originally posted by Christian Marquardt View Post
              Vielleicht mal einen visuellen Editor https://netbeans.org/features/java-on-client/swing.html ausprobieren
              Das habe ich bereits hinter mir. Und bin ziemlich enttäuscht.
              Ich hatte ursprünglich Ecplise Luna mit dem WindowBuilder, bis dann unter Java 8 der WindowBuilder alle naselange chrashte.
              Vorteil beim WindowBuilder ist, dass du dir den generierten Code ansehen kannst.
              Dann habe ich Netbeans ausprobiert, der arbeitet aber nur mit dem Grouplayout und lässt keine anderen Layout zu - zumindest habe ich nichts entdeckt. Und der runable JAR-Export ist gar nicht möglich. Netbeans ist also keine Alternative.

              Inzwischen habe ich Intellj für mich entdeckt. Großer Vorteil dieser IDE gegenüber den beiden anderen ist, dass diese sehr gut AutoCompletation macht, und wesentlich mehr Features zur Arbeitserleichterung aufweist.
              Allerdings ist der GUI-Builder hier sehr mager und es wird eine XML-Datei für das GUI-Design neben der Java-Datei erzeugt. Allerdings der Code, der die Initialisierung der GUI-Componenten enthält, taucht nirgends sichtbar auf.
              Der JFormDesigner (Kostenpflichtig) generiert noch komplexeren Code, indem er immer erst ein
              Container contentPane = getContentPane();
              generiert, dem er alle anderen Container (JPanel, etc.) hinzufügt.

              Ich hatte mich aufgrund dessen entschieden, die GUIs alle selbst aufzusetzen. Eben, um zu lernen, warum das so und nicht so gemacht wird. Es bringt absolut nichts, eine GUI zusammen zuklicken und nachher den Code nicht zu verstehen.
              das ist exakt dasselbe wie mit den Wysiwyg-Editoren bei HTML-Webdesign. Das geht zwar schnell, nützt aber nichts, wenn du den HTML-, CSS- und Script-Code nicht verstehst und somit nicht verändern kannst. Genauso ist das mit den Layout-Managern.

              Wambui

              Comment


              • #8
                Dann habe ich Netbeans ausprobiert, der arbeitet aber nur mit dem Grouplayout und lässt keine anderen Layout zu - zumindest habe ich nichts entdeckt.
                -> Rechte Maustaste -> Layout auswählen
                Und der runable JAR-Export ist gar nicht möglich.
                -> Häää? Im DIST-Ordner steht immer das erzeugte JAR und hast du in den Properties die Mainklasse vorgegeben, wird auch das Manifest korrekt erzeugt. Alle JARs lassen sich dann mit Doppelklick starten

                Intellj ist kostenpflichtig gerade für OR-Mapping usw.

                Nunja, es ging ja darum den von den GUI-Buildern erzeugten Code sich anzusehen und zu erkennen, wie die das machen. Und man kann sich halt Arbeit ersparen.

                Des Weiteren bietet Netbeans das FreeDesign an. Das möchte man nicht selbst erstellen......
                Zuletzt editiert von Christian Marquardt; 05.03.2015, 22:58.
                Christian

                Comment


                • #9
                  Brauche ich im Moment object-relational mapping? Intellj C tuts es auch. Zudem gibt es die Android-Entwicklung nur noch für Android-Studio, womit du wieder bei Intellij bist. Und wie gesagt, ich finde die IDE sehr gut.
                  Okay, das
                  -> Rechte Maustaste -> Layout auswählen
                  ist mir entgangen.
                  Das sind ja exakt meine Gedanken:
                  es ging ja darum den von den GUI-Buildern erzeugten Code sich anzusehen und zu erkennen, wie die das machen. Und man kann sich halt Arbeit ersparen.

                  Comment


                  • #10
                    Eine IDE ist ein Werkzeug und wenn Intellj deine Anforderungen erfüllt, dann nutze sie.

                    Ob du OR-Mapper brauchst, weiß ich nicht und andere IDEs haben halt doch mehr Features......wenn man sich mit diesen befasst (Hilfe benutzen)

                    Nun, oben hast du ein Beispiel mit deinen Elemeten

                    Das mag auch helfen
                    http://docs.oracle.com/javase/tutori...ut/visual.html
                    http://docs.oracle.com/javase/tutori...out/using.html

                    EDIT
                    Jeder Container wird in gleicher Art un Weise erstellt
                    - Layout wählen
                    - Componete erzeugen
                    - mit add() hinzufügen

                    Vielleicht fängst du so an, beginnend mit dem JFrame
                    Zuletzt editiert von Christian Marquardt; 18.02.2015, 12:37.
                    Christian

                    Comment

                    Working...
                    X