1

描画したオブジェクトが GUI に表示されないという問題が発生しています。データがログ ファイルにプッシュされているため、処理中であることがわかります。ただし、グラフィックは表示されません。

これが私のコードの一部です:

public static void main(String[] args)
{
   JFrame window = new JFrame();
   window.setLayout(new BorderLayout());
   window.setVisible(true);
}

私があちこちに配置したボタンと他のいくつかのウィジェットがあります。中央のペイン (BorderLayout.CENTER) は、myDrawnObjectが表示される場所です。

// Called when button is pushed/clicked
public static void trigger()
{
   DrawnObject shape = new DrawnObject();
   window.setLayout(new BorderLayout());
   window.getContentPane().add(shape, BorderLayout.CENTER);
   window.pack;
}

public class DrawnObject extends JComponent()
{
   @Override
   public Dimension getMinimumSize()
   {
       return new Dimension(100, 100);
   }

   @Override
   public Dimension getPreferredSize()
   {
       return new Dimension(500, 500);
   }

   @Override
   public Dimension getMaximumSize()
   {
       return new Dimension(700, 700);
   }

   @Override
   public void paintComponent(Graphics g)
   {
      super.paintComponent(g);
      g.setColor(Color.RED);
      g.fillRect(10, 10, 10, 10);
   }
}

Graphicsオブジェクトを as としてキャストGraphics2Dし、適切な描画メソッドを使用しようとしましたが、それは役に立ちませんでした。

4

3 に答える 3

4

色を変えてみて…

super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(10, 10, 10, 10);

グラフィックコンテキストの色は、デフォルトでコンポーネントの背景色に設定されています

ここに画像の説明を入力

public class PaintTest01 {

    public static void main(String[] args) {
        new PaintTest01();
    }

    public PaintTest01() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new DrawPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class DrawPane extends JPanel {

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(30, 30);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillRect(10, 10, 10, 10);
        }
    }
}

更新しました

質問の更新されたコードから、コンパイルできません...

JFrameローカル変数であるコンストラクターで名前付きウィンドウを作成します...

public static void main(String[] args)
{
   JFrame window = new JFrame();
   window.setLayout(new BorderLayout());
   window.setVisible(true);
}

次に、ウィンドウに追加しようとDrawObjectします...

public static void trigger()
{
   DrawnObject shape = new DrawnObject();
   window.setLayout(new BorderLayout());
   window.getContentPane().add(shape, BorderLayout.CENTER);
   window.pack;
}

しかし、window未定義であるため、例はコンパイルできません。

これがコンパイルされる唯一の方法は、クラスレベルで という静的変数がある場合です。その場合、その変数を初期化していない限り、 をwindow生成する必要があります。NullPointerException

public class MyDrawing {
    public static JFrame window = new JFrame();

これは、2 つのフレームがあることを意味します。1 つはコンストラクターで作成し、もう 1 つは静的レベル クラス フィールドとして作成します。これらは異なるインスタンスであるため、これは機能しません

于 2012-10-17T10:22:38.460 に答える
3
  • public class DrawnObject extends JComponent() から PreferredSizeを返す必要があります。それ以外の場合は戻りますDimension(0, 0);

  • Top-Level containers実装されてBorderLayoutおり、window.add(shape, BorderLayout.CENTER);適切なコード行であり、JComponent正しく配置する必要があります

  • pack()の代わりに使用しますinvalidate()。このコード行は機能しません。BorderLayoutまたはGridLayout(ei ???) によって配置されたコンテナに対して何かを呼び出すためにも、 に基づくコンテナに対しても、 にJComponentJComponentも実装されLayoutManagerていないAPIため、戻る必要があります。PreferredSize

  • より良いヘルプのために、SSCCEをすぐに投稿してください

于 2012-10-17T10:14:25.000 に答える
1

Windowsのコンテンツペインにを追加DrawnObjectしてみてください。また、レイアウトを設定することも忘れないでください。nullレイアウトを使用することはお勧めできません(invalidateを呼び出すと、レイアウトはnullに設定されます)。

window.getContentPane().setLayout(new BorderLayout());
window.getContentPane().add(shape, BorderLayout.CENTER);
window.pack();
window.setVisible(true);

また、をスキップしてみてくださいinvalidate()

于 2012-10-17T10:02:52.907 に答える