4

私は自分でこの問題を解決することができないので、私はあなたの助けをひどく必要とします。GUIを作成しようとしていて、ボタンを押した後に何かを描画したいのですが、何らかの更新/再検証またはスレッド化の問題があるようです。絵は描かれていますが、ウィンドウのサイズを変更すると絵が消えます。また、ウィンドウをすばやく移動すると、図面の一部が消えます。私は多くのことを試みましたが、この問題を機能させることができません。多分あなたは私を助けることができます。そもそも自分でコードを書くのではなく、NetBeans Design関数を使ってボタンやパネルなどを生成するように指示されました。これにより、描画プロセスや関数が損なわれる可能性がありますが、わかりません。私はあなたに関連するコードを投稿し、提案に非常に感謝します(コメントされたものは私が以前に試したものからの単なるアーティファクトなので、気にしないでください):

public class NewJFrame extends JFrame  {
  public NewJFrame() { initComponents(); }

  @SuppressWarnings("unchecked")
  private void initComponents() {
    jButton1 = new javax.swing.JButton();
    jPanel1 = new javax.swing.JPanel();
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setMinimumSize(new java.awt.Dimension(1200, 1000));
    jButton1.setText("Draw");
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1ActionPerformed(evt);
      }
    });
    GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGap(0, 1000, Short.MAX_VALUE)
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGap(0, 0, Short.MAX_VALUE)
    );
    GroupLayout layout = new GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jPanel1, GroupLayout.DEFAULT_SIZE, 1000, Short.MAX_VALUE)
            .addGap(18, 18, 18)
            .addComponent(jButton1)
            .addGap(33, 33, 33))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(0, 745, Short.MAX_VALUE)
                    .addComponent(jButton1)
                    .addGap(237, 237, 237))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jPanel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())))
    );

    pack();
  }// </editor-fold>

  private void jButton1ActionPerformed(ActionEvent evt) {
    Graphics g = jPanel1.getGraphics();
    draw(jPanel1, g);
  }

  protected void paintComponent(Graphics g){
    jPanel1.setSize(1000, 1000);
    Dimension d = jPanel1.getSize();
    g.setColor(Color.BLACK);
    for (int i=0; i<=1000;i++){
      if (i%100==0){
        g.setColor(Color.RED);
        g.drawLine(i, d.height/2, i, (d.height/2)+100);
      }
      else if(i%50==0 && i%100!=0){
        g.setColor(Color.BLUE);
        g.drawLine(i, d.height/2, i, (d.height/2)+100);
      }
      else {
        g.setColor(Color.BLACK);
        g.drawLine(i, d.height/2, i, (d.height/2)+100);
      }
    }
    g.setColor(Color.green);
    g.drawLine(0, d.height / 2, d.width, d.height / 2);
  }

  public void draw(JPanel Jpanel1, Graphics g) {
    System.out.println("wuffkowski");
    Jpanel1.setSize(1000,1000);
    Dimension d = Jpanel1.getSize();
    g.setColor(Color.BLACK);
    for (int i=0; i<=1000;i++){
      if (i%100==0){
        g.setColor(Color.RED);
        g.drawLine(i, d.height/2, i, (d.height/2)+100);
      }
      else if(i%50==0 && i%100!=0){
        g.setColor(Color.BLUE);
        g.drawLine(i, d.height/2, i, (d.height/2)+100);
      }
      else {
        g.setColor(Color.BLACK);
        g.drawLine(i, d.height/2, i, (d.height/2)+100);
      }
    }
    g.setColor(Color.green);
    g.drawLine(0, d.height / 2, d.width, d.height / 2);
    Jpanel1.paintComponents(g);
  }

  public static void lala () {
    try {
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(info.getName())) {
          javax.swing.UIManager.setLookAndFeel(info.getClassName());
          break;
        }
      }
    } catch (ClassNotFoundException ex) {
      java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
      java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
      java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
      java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
        NewJFrame JF =new NewJFrame();
        JF.setVisible(true);
      }
    });
  }
  private javax.swing.JButton jButton1;
  private javax.swing.JPanel jPanel1;
}

貴重な時間をありがとうございました。

4

4 に答える 4

6

Java は描画コマンドを覚えていません。draw()が呼び出されるのはそのときだけであるため、ボタンをクリックするとグラフィックが一度レンダリングされます。

サイズ変更後にレンダリングを更新する場合は、オーバーライドpaint(Graphics)して呼び出しますdraw()

draw()それがボタンのクリックに関連している場合は、何かを描画する必要があるかどうかなど、必要なすべてを記憶しているクラスにフィールドを追加する必要があります。

private boolean drawAtAll = false;

private void jButton1ActionPerformed(ActionEvent evt) {
  drawAtAll = true; // ok to draw now
  draw();
}

@Override
public void paint(Graphics g) {
   super.paint(g);
   draw();
}

public void draw() {
  if( !drawAtAll ) return;

  Graphics g = jPanel1.getGraphics();
  ...
}

参考文献:

于 2012-04-30T08:24:02.173 に答える
5

このコードを実際に試してみて、不明な点があれば、JPanel のpaintComponent(...)メソッド内でペイントしてください。上記のサイズを毎回提供する代わりに、上記のコンポーネントのgetPreferredSize()JComponentを単純にオーバーライドできます。を呼び出すには、プログラム内から明示的に呼び出すのではなく、簡単に記述できます。Swing は自動的に呼び出しを行います。paintComponent(...)repaint()paintComponent(...)

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PaintingExample
{
    private CustomPanel paintingPanel;
    private Timer timer;
    private int x = 1;
    private int y = 1;
    private ActionListener timerAction = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            x++;
            y++;
            paintingPanel.setPosition(x, y);
        }
    };

    private void createAndDisplayGUI()
    {
        JFrame frame = new JFrame("Painting Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        paintingPanel = new CustomPanel();
        final JButton startStopButton = new JButton("STOP");
        startStopButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                if (timer.isRunning())
                {
                    startStopButton.setText("START");
                    timer.stop();
                }
                else if (!timer.isRunning())
                {
                    startStopButton.setText("STOP");
                    timer.start();
                }
            }
        });

        frame.add(paintingPanel, BorderLayout.CENTER);
        frame.add(startStopButton, BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
        timer = new Timer(100, timerAction);
        timer.start();
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new PaintingExample().createAndDisplayGUI();
            }
        });
    }
}

class CustomPanel extends JPanel
{
    private int x = 0;
    private int y = 0;

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

    public void setPosition(int a, int b)
    {
        x = a;
        y = b;
        if (x <(getWidth() - 10) && y < (getHeight() - 10))
            repaint();
        else
            System.out.println("Nothing is happening...");
    }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.clearRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.MAGENTA);
        g.fillOval(x, y, 10, 10);
    }
}
于 2012-04-30T09:04:10.047 に答える
2

paintComponentすべてのコードを調べたわけではありませんが、すぐにわかるのは、を呼び出さずにメソッドをオーバーライドしてはならないということですsuper.paintComponent。そして、コメントアウトされた行呼び出しsuper.paintComponents(s に注意してください) は同じではありません。

Jpanel1.setSize( 1000, 1000 )また、「ウィンドウのサイズを変更したとき」の意味と、それがコード全体に表示される呼び出しとどのように結びついているのかわかりません。レイアウト マネージャーがパネルのサイズを処理します。それを固定サイズに設定しないでください。

于 2012-04-30T08:08:34.267 に答える
0

パネルのサイズを変更したり、位置を変更したり、最小化して最大化したりするとpaint(...)、コンテンツを再描画するメソッドが呼び出されます。この関数を上書きして、線などを描画させる必要があります。これを行うには、必要に応じて再描画できるように、おそらく図面をデータ構造に保存する必要があります。

塗り方はこちらで解説しています。

于 2012-04-30T08:08:31.943 に答える