2

このプログラムでは、JPanelタブに表示されるポリゴンが作成されます。

それを見せるために、シェイプをオーバーライドして、セッター メソッドを作成する必要がありました。残念ながら、それは表示されておらず、プログラムも実行されていません。

エラー:

スレッド「メイン」での例外 java.lang.IllegalArgumentException:
  SelectShape コンポーネント 1 = new SelectShape(x, y, vert); でコンテナーにウィンドウを追加します。メソッドPage1で。

それが機能する唯一の方法は、フレームを作成して JTab を削除し、フレームに形状を割り当てることですが、それは私が作りたいものではありません。1 つのグラフィック手法を使用して、図形を * 異なるタブ * に配布できるプログラムを作成したいと考えています。

コードは次のとおりです。

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()JDialogJFrame
  • paintXXXメソッドのスーパーメソッドを常に呼び出す
  • public SelectShape(int[] x, int y[], int vert) { // setter methodセッターメソッドではありません。引数を3つ取り代入するコンストラクタです。すべての場合において、これらの変数を作成したため、これはあなたのケースではまったく何もしませんstaticstatic定数を記述する場合は、unlessの使用を避けてください。その場合は、finalキーワードも続ける必要があります。
  • UI を開始し、イベント ディスパッチ スレッド (EDT) で UI に対するすべての変更を実行します。これは、 を使用して簡単に実行できますSwingUtilities.invokeLater()
  • 表示されているエラー:スレッド "メイン" の例外 java.lang.IllegalArgumentException:禁止されJFrameているに を追加しようとしているため、コンテナーにウィンドウを追加することがスローされます。何にも追加できません。それをしたい場合は、使用して追加する必要があります(ただし、それは別の話です)。JComponentJFrameJDesktopPaneJInternalFrame

あなたが何を達成しようとしているのかはよくわかりませんが、あなたのものから派生した実際のコードは次のとおりです。

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 に答える