在此程序中,会创建一个多边形以显示在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);
}
}
答案 0 :(得分:3)
我认为你在代码中混合了许多概念,最终导致无法理解的代码。
JFrame
未展开JComponent
且没有paintComponent
方法。考虑对覆盖另一个的方法使用@Override
注释。这样你就可以轻易犯错。JFrame
方法(paint()
,JDialog
,...)JFrame
方法paintXXX
不是setter方法。它是一个构造函数,它接受3个参数并分配它们。在所有情况下,在您的情况下,这绝对没有任何意义,因为您创建了这些变量public SelectShape(int[] x, int y[], int vert) { // setter method
。除非您描述常量,否则请避免使用static
,在这种情况下,也应该跟static
关键字一起使用。final
。SwingUtilities.invokeLater()
添加到容器中JFrame
这是被禁止的。 JComponent
无法添加到任何内容中。如果您想这样做,则需要使用JFrame
并添加JDesktopPane
(但这是另一个故事)。我不太确定你想要达到的目标,但这是一个从你的工作代码中得到的更好的工作代码:
JInternalFrame