创建和覆盖形状以适应JPanel?

时间:2013-04-20 15:50:43

标签: java swing jframe jcomponent

在此程序中,会创建一个多边形以显示在JPanel选项卡中。

为了使它显示我必须覆盖形状并为它创建一个setter方法。不幸的是它没有显示,程序也没有运行。

错误:

  

线程“main”中的异常java.lang.IllegalArgumentException:添加   一个容器的窗口
  在SelectShape component1 = new SelectShape(x,y,vert);在方法中   第1页。

唯一可行的方法是制作一个框架并移除JTab并将形状分配到框架上,但这不是我想要制作的。我想制作一个程序,可以使用一种图形方法将形状分配到*不同的标签*。

以下是代码:

import java.awt.*;
import java.io.IOException;
import javax.swing.*;


/* This program create a graphics component that draws a polygon 
 */
public class SelectShape extends JFrame 
{
    private JTabbedPane tabbedPane;
    private JPanel panel1; 

    // //////////////////////////

    static int[] x = { 20, 40, 50, 65, 80, 95 }; // Co-ords for a polygon
    static int[] y = { 60, 105, 105, 110, 95, 95 };
    static int vert = 6;

    public SelectShape() throws IOException // Builds GUI
    {
        setTitle("Program");
        setSize(900, 600);
        setBackground(Color.gray);

        JPanel topPanel = new JPanel();
        topPanel.setLayout(new BorderLayout());
        getContentPane().add(topPanel);

        // Create the tab pages
        createPage1();

        // Create a tabbed pane
        tabbedPane = new JTabbedPane();
        tabbedPane.addTab("Shape Panel", panel1);
    }

    public void createPage1() throws IOException // Creates JPanel
    {
        panel1 = new JPanel();
        panel1.setLayout(null);

        SelectShape component1 = new SelectShape(x, y, vert); //error
        SelectShape component2 = new SelectShape(x, y, vert); //over-rides shape

        component1.setBounds(290, 70, 120, 40);
        component2.setBounds(290, 70, 120, 40);

        panel1.add(component1); // is not displayed!
        panel1.add(component2); // component2 overwrites component1!!!
        panel1.setVisible(true);

    }

    // overrides javax.swing.JComponent.paintComponent
    public void paintComponent(Graphics g) {
        // Recover Graphics2D
        Graphics2D g2 = (Graphics2D) g;

        // Construct a polygon then draw it
        Polygon polygon = new Polygon(x, y, vert); 
        g2.draw(polygon);
        g2.fill(polygon);
    }

    public SelectShape(int[] x, int y[], int vert) { // setter method
        this.x = x;
        this.y = y;
        this.vert = vert;
    }

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

        SelectShape mainFrame = new SelectShape(); //Frame
        mainFrame.setVisible(true);

    }
}

1 个答案:

答案 0 :(得分:3)

我认为你在代码中混合了许多概念,最终导致无法理解的代码。

  • JFrame未展开JComponent且没有paintComponent方法。考虑对覆盖另一个的方法使用@Override注释。这样你就可以轻易犯错。
  • 无论如何都不需要展开{​​{1}}并且永远不会覆盖顶级容器的JFrame方法(paint()JDialog,...)
  • 始终调用JFrame方法
  • 的超级方法
  • paintXXX不是setter方法。它是一个构造函数,它接受3个参数并分配它们。在所有情况下,在您的情况下,这绝对没有任何意义,因为您创建了这些变量public SelectShape(int[] x, int y[], int vert) { // setter method。除非您描述常量,否则请避免使用static,在这种情况下,也应该跟static关键字一起使用。
  • 启动UI,并在事件调度线程(EDT)上对UI执行所有修改。这可以通过final
  • 轻松完成
  • 您看到的错误:线程“main”中的异常java.lang.IllegalArgumentException:抛出向容器添加窗口,因为您尝试将SwingUtilities.invokeLater()添加到容器中JFrame这是被禁止的。 JComponent无法添加到任何内容中。如果您想这样做,则需要使用JFrame并添加JDesktopPane(但这是另一个故事)。

我不太确定你想要达到的目标,但这是一个从你的工作代码中得到的更好的工作代码:

JInternalFrame