如何在Java swing中使用拆分面板进行绘制

时间:2017-05-12 15:39:50

标签: java swing user-interface panel paint

最近,我遇到了一个问题,即函数中没有调用 paintComponent 函数,我发现当我使用 splitpane 函数时,它会禁用绘制功能,并给出错误:

  

无法添加到布局:未知约束:null

我认为绘画功能可能不会以正确的方式添加,下面是我的代码(部分):

课程:考试

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 ();
     }
}

类: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);
    }
}

当我评论frame.add(jTabbedpane)时,可以在面板中绘制线条,但是它只能在一个面板中使用,我无法将其绘制到另一个分割面板中,我不会知道为什么..当我取消注释frame.add(jTabbedpane)时,它会弹出上面提到的错误。

2 个答案:

答案 0 :(得分:0)

您的UI程序集没有意义。您正在致电' setContentPane'到splitpane,这是好的(但很不寻常),但是你在框架上调用add(),然后尝试向contentPane(JSplitPane)添加其他内容。您应该在将splitPane添加到JPanel之前将JTabbedPane添加到SplitPane,或者以不同方式设置布局。

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

关于绘制蓝线的第二个问题更复杂。 您正在做一堆疯狂的事情 - 您正在创建NewPanel并尝试将其添加到JFrame,但之后您正在设置JFrame的contentPane以后到另一个组件。您需要完成Swing教程并更好地布局您的UI。

答案 1 :(得分:0)

  

我认为可能无法以正确的方式添加绘画功能,

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

您排在首位paintComponent(...),为什么要拨打super.paint(...)

首先阅读Swing基础知识的Swing Tutorial。本教程中的所有部分都有可下载和测试的工作示例。

所以你可以从:

开始
  1. 如何使用拆分窗格 - 它将显示如何将拆分窗格添加到框架
  2. 执行自定义绘画 - 它将解释绘画的工作原理并展示如何覆盖paintComponent(...)方法。