Größenänderungsproblem mit Canvas in jscrollpane in jsplitpane

Lesezeit: 4 Minuten

Grosenanderungsproblem mit Canvas in jscrollpane in jsplitpane
Sakis Vtdk

Ich erstelle eine Anwendung mit dem NetBeans GUI Editor, in der ich eine haben möchte JSplitPanedessen oberste Komponente a sein wird Canvas innerhalb eines JScrollPane und die untere Komponente wird a sein JTextAreaoder etwas ähnliches.

Wenn ich den Teiler nach unten ziehe und damit die Größe der oberen Komponente vergrößere, scheint sich alles in Ordnung zu bringen.

Das Problem tritt auf, wenn ich versuche, die Trennwand nach oben zu schieben: Die Trennwand scheint unter die zu gehen Canvas (und vielleicht unter dem JScrollPane zu).

Ich habe verschiedene Kombinationen der bevorzugten/minimalen/maximalen Größen von ausprobiert JScrollPane und Canvas aber nichts scheint zu funktionieren.

Dies ist der Teil des Codes, den Netbeans generiert hat und der möglicherweise etwas mit dem vorliegenden Problem zu tun hat:

jSplitPane1 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
canvas1 = new java.awt.Canvas();
jTextField1 = new javax.swing.JTextField();

jSplitPane1.setDividerLocation(300);
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);

jScrollPane1.setViewportView(canvas1);

jSplitPane1.setTopComponent(jScrollPane1);

jTextField1.setText("jTextField1");
jSplitPane1.setRightComponent(jTextField1);

Da dies meine erste Frage ist, darf ich kein Bild in die Frage einbetten, also poste ich einfach den Link:

Grosenanderungsproblem mit Canvas in jscrollpane in jsplitpane

Die roten Pfeile zeigen die Position des Teilers an.

Vielen Dank im Voraus für Ihre Zeit.

  • Warum verwenden java.awt.Canvas anstatt javax.swing.JPanel?

    – davidbuzatto

    13. August 2012 um 22:02 Uhr


  • Weil ich neu bei Swing bin und Leinwand für meinen Zweck, nämlich Formen darauf zu zeichnen, die richtige Wahl zu sein schien. Ich werde mir auch das JPanel ansehen, um zu sehen, ob es meinen Anforderungen entspricht.

    – Sakis Vtdk

    13. August 2012 um 22:07 Uhr


  • Es wird Ihren Bedürfnissen entsprechen und es ist die beste Wahl, da es nicht gut ist, AWT- und Swing-Komponenten zu mischen. AWT-Komponenten sollten vermieden werden. Ich weiß wirklich nicht, was ich antworten soll, da ich nicht verstanden habe, was Sie tun möchten.

    – davidbuzatto

    13. August 2012 um 22:09 Uhr


  • Das Problem ist, dass die Leinwand größer wird, aber wenn ich sie wieder kleiner machen möchte, ändert sich die Größe nicht.

    – Sakis Vtdk

    13. August 2012 um 22:14 Uhr

1646418430 177 Grosenanderungsproblem mit Canvas in jscrollpane in jsplitpane
Müllgott

Anstatt setPreferredSize()lassen Sie Ihre Komponenten ihre eigene bevorzugte Größe berechnen und pack() die Umschließung Window unterzubringen. Das folgende Beispiel fügt eine Instanz von hinzu draw.GraphPanel nach oben und ein entsprechendes Bedienfeld nach unten.

Bild

import draw.GraphPanel;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;

/**
 * @see https://stackoverflow.com/q/11942961/230513
 */
public class SplitGraph extends JPanel {

    public SplitGraph() {
        super(new GridLayout());
        JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        GraphPanel graphPanel = new GraphPanel();
        split.setTopComponent(new JScrollPane(graphPanel));
        split.setBottomComponent(graphPanel.getControlPanel());
        this.add(split);
    }

    private void display() {
        JFrame f = new JFrame("SplitGraph");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new SplitGraph().display();
            }
        });
    }
}

  • Abgesehen davon, lassen Sie sich Ihr Design nicht vom GUI-Designer diktieren.

    – Müllgott

    14. August 2012 um 0:39 Uhr

  • Diese GraphPanel-Klasse scheint sehr interessant zu sein. Danke für das Teilen 🙂

    – Sakis Vtdk

    14. August 2012 um 8:48 Uhr

1646418431 832 Grosenanderungsproblem mit Canvas in jscrollpane in jsplitpane
davidbuzatto

Wie ich in meinen Kommentaren sagte, sollten Sie AWT- und Swing-Komponenten nicht mischen. Ich denke, Sie verwenden die Komponenten nicht richtig. Schauen Sie es sich an, es ist ein einfaches Beispiel für die Verwendung eines JSplitPane.

import java.awt.*; // it is necessary to use the Dimension and BorderLayout classes
import javax.swing.*;

public class Foo extends JFrame {

    public Foo() {

        setTitle( "Splits" );
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setSize( 400, 400 );

        JSplitPane split = new JSplitPane( JSplitPane.VERTICAL_SPLIT );
        split.setDividerLocation( 200 );
        add( split );

        JPanel panel1 = new JPanel();
        panel1.setLayout( new BorderLayout() );
        panel1.add( new JLabel( "top panel" ), BorderLayout.NORTH );

        JPanel myDrawPanel = new JPanel();
        myDrawPanel.setPreferredSize( new Dimension( 100, 100 ) );
        myDrawPanel.add( new JLabel( "draw panel here!" ) );
        panel1.add( new JScrollPane( myDrawPanel ), BorderLayout.CENTER );

        split.setTopComponent( panel1 );


        JPanel panel2 = new JPanel();
        panel2.add( new JLabel( "bottom panel" ) );
        split.setBottomComponent( panel2 );


        setVisible( true );

    }

    public static void main( String[] args ) {
        new Foo();
    }

}

Grosenanderungsproblem mit Canvas in jscrollpane in jsplitpane
Sakis Vtdk

Nachdem ich den Kommentar von davidbuzatto gelesen hatte, googelte ich über das Mischen von AWT- und Swing-Komponenten und war ein wenig überrascht, als ich herausfand, dass dies eine so schlechte Praxis ist.

Ich habe die genaueste Antwort auf meine Frage gefunden Hier

Schwere Komponenten haben ihre eigene Z-Ordnung. Aus diesem Grund können Swing und AWT nicht in einem Container kombiniert werden. Wenn dies der Fall ist, werden die AWT-Komponenten auf TOP of Swing-Komponenten gezeichnet.

Zum Beispiel: Wenn AWT-Komponenten mit JtabbedPane verwendet werden, verschwinden sie nicht, wenn die Registerkarten gewechselt werden.

Danke Davidbuzatto, dass du mir den Weg gezeigt hast 🙂

937520cookie-checkGrößenänderungsproblem mit Canvas in jscrollpane in jsplitpane

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy