2

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

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

错误:

线程“main”中的异常 java.lang.IllegalArgumentException:
  在 SelectShape 组件 1 = new SelectShape(x, y, vert) 处向容器添加窗口;在方法 Page1 中。

唯一可行的方法是制作一个框架并移除 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);

    }
}
4

1 回答 1

3

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

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

我不太确定您要实现的目标,但这是从您的代码派生的工作代码,效果更好:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

/* This program create a graphics component that draws a polygon 
 */
public class SelectShape extends JPanel {

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

    private static final Polygon POLYGON = new Polygon(x, y, Math.min(x.length, y.length));
    private static final Ellipse2D CIRCLE = new Ellipse2D.Double(100, 40, 45, 45);

    // Class variables
    private final Shape shape;
    private Dimension preferredSize;

    public SelectShape(Shape shape) {
        this.shape = shape;
        Rectangle bounds = shape.getBounds();
        this.preferredSize = new Dimension(bounds.x + bounds.width, bounds.y + bounds.height);
    }

    @Override
    public Dimension getPreferredSize() {
        return preferredSize;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g.setColor(Color.BLUE);
        g2.draw(shape);
        g2.fill(shape);
    }

    public static void main(String[] args) throws IOException {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame mainFrame = new JFrame("Program");
                mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                SelectShape polygon = new SelectShape(POLYGON);
                SelectShape circle = new SelectShape(CIRCLE);
                // Create a tabbed pane
                JTabbedPane tabbedPane = new JTabbedPane();
                tabbedPane.addTab("Polygon", polygon);
                tabbedPane.addTab("Circle", circle);
                mainFrame.add(tabbedPane);
                mainFrame.pack();
                mainFrame.setVisible(true);
            }
        });

    }
}
于 2013-04-22T08:28:27.407 回答