2017-05-12 3 views
0

Vor kurzem habe ich ein Problem begegnet, dass die paintcomponent Funktion nicht in der Funktion aufgerufen wird, und ich fand, dass, wenn ich splitpane Funktion zu verwenden, wird es das Deaktivieren male Funktion und gibt Fehler:Wie in einem Split-Panel in Java Swing malen

cannot add to layout: unknown constraint: null

ich die Farbe Funktion denken nicht an die richtigen Art und Weise hinzugefügt werden kann, unter meinem Code ist (teilweise):

Klasse: Test

public class Test extends JFrame{ 

    public Test() throws IOException{ 
     //JFrame jf = new JFrame("my frame"); 
     this.add(new NewPanel(this)); 

     this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     this.setBounds(300,200,1050,600); 
     this.setVisible (true); 

    } 

    public static void main (String[] args) throws IOException{ 

     Test test = new Test(); 
     test.setTitle("Hello"); 
      //frame.pack(); 
    } 
} 

Klasse: newpanel

public class NewPanel extends JPanel{ 
    public NewPanel(JFrame frame) throws IOException{ 
      JTabbedPane jTabbedpane = new JTabbedPane(); 
      JSplitPane splitPane = new JSplitPane(); 
      JPanel p1    = new JPanel(); 

      p1.setLayout(null); 
      p2.setLayout(new FlowLayout()); 

      splitPane.setOneTouchExpandable(true); 
      splitPane.setContinuousLayout(true); 
      //splitPane.setPreferredSize(new Dimension (250,500)); 
      splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); 
      splitPane.setLeftComponent(p1); 
      splitPane.setRightComponent (p2); 
      splitPane.setDividerSize(3); 
      splitPane.setDividerLocation(250); //balance two panels width 

      jTabbedpane.addTab("ABC",p2); 
      jTabbedpane.addTab("AB",p3); 
      jTabbedpane.addTab("AC",p4); 
      jTabbedpane.addTab("BC",p5); 

      frame.setContentPane(splitPane); 
      frame.add(jTabbedpane); 

      } 
    } 
    public void paintComponent(Graphics g){ 
     super.paint(g); 
     g.setColor(Color.BLUE); 
     g.drawLine(303, 90, 303, 200); 
     g.drawLine(583, 90, 583, 200); 
     g.drawLine(863, 90, 863, 200); 
    } 
} 

Als ich frame.add(jTabbedpane) Kommentar kann die Linie in der Platte gezogen könnte, ABER es ist nur in einem Panel zur Verfügung, ich kann es in einem anderen Split-Panel nicht zeichnen, I don‘ Ich weiß, warum ... Und wenn ich frame.add(jTabbedpane) auskommentiere, erscheint der oben erwähnte Fehler.

Antwort

0

Ihre UI-Assembly ist nicht sinnvoll. Du rufst 'setContentPane' an die Splitpane an, was eine Art OK (aber ungewöhnlich) ist, aber dann rufst du add() zum Frame, der versucht, etwas anderes zum contentPane (dem JSplitPane) hinzuzufügen. Sie sollten entweder das JTabbedPane zum SplitPane hinzufügen, bevor Sie das SplitPane zum JPanel hinzufügen, oder Ihr Layout anders gestalten.

//These don't make sense together. 
frame.setContentPane(splitPane); 
frame.add(jTabbedpane); 

Ihre zweite Frage zum Zeichnen der blauen Linie ist komplizierter. Sie machen eine Menge verrückten Kram - Sie erstellen eine NewPanel und versuchen, sie der JFrame hinzuzufügen, aber dann setzen Sie den contentPane des JFrame später auf eine andere Komponente. Sie müssen das Swing-Tutorial durchlaufen und Ihre Benutzeroberfläche besser darstellen.

0

I think the paint function may not be added to the right way,

public void paintComponent(Graphics g){ 
    super.paint(g); 

Sie sind zwingende paintComponent(...), also warum rufst du super.paint(...)?

Beginnen Sie mit dem Lesen der Swing Tutorial für Swing-Grundlagen. In allen Abschnitten des Tutorials finden Sie Arbeitsbeispiele, die Sie herunterladen und testen können.

So könnten Sie beginnen mit:

  1. Wie Split Panes verwenden - es wird Ihnen zeigen, wie eine geteilte Scheibe an einem Rahmen hinzufügen
  2. Performing Benutzerdefinierte Gemälde - es wird erklärt, wie Malerarbeiten und der Show Wie überschreibt man die Methode paintComponent (...).