2017-06-08 17 views
0

ボタンをクリックしてから線を2倍長く描画する必要がありますが、ウィンドウのサイズを変更してからウィンドウをサイズ変更した後にのみ行います。私は何が起こっているのか分からない、私はこれが簡単になると思った。スウィングはリサイズ後にのみ描画されます

どうすれば修正できますか教えてください。コンテナのレイアウトはコンポーネントが追加または削除されることが多い場合は、再実行する必要があり、あなたがやってたり希望しているものでないとき

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

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Line2D; 
import java.awt.geom.Point2D; 
import java.util.Random; 
import java.util.Stack; 

class MyButtonPanel extends JPanel { 

public static final int HEIGHT = 800; 
public static final int WIDTH = 800; 
private JButton greenButton; 
private JPanel buttonPanel; 
Stack<Point> points; 
int X = 25; 
int Y = 25; 

public MyButtonPanel() { 
    greenButton = new GreenButton(); 
    points = new Stack<Point>(); 

    buttonPanel = this; 

    setLayout(new FlowLayout()); 
    setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
    add(greenButton); 

} 

class GreenButton extends JButton implements ActionListener 
{ 
    GreenButton() { 
     super("LongerLine"); 
     addActionListener(this); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     //points.push(new Point(0,0)); 
     X = 2 * X; 
     Y = 2 * Y; 
     validate(); 
    } 

} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    //g2d.setColor(Color.WHITE); 
    //g2d.fillRect(0, 0, WIDTH, HEIGHT); 
    g2d.setColor(Color.BLACK); 
    //drawLines(g2d); 
    Line2D lin = new Line2D.Double(0,0, X, Y); 
    g2d.draw(lin); 
} 

private void drawLines(Graphics2D g2d) { 
    //Line2D lin = new Line2D.Float(100, 100, 250, 260); 
    //g2d.draw(lin); 
    double x1, y1, x2, y2; 
    /* 
    for(Point point: points) { 
     x1 = (double) point.getX(); 
     y1 = (double) point.getY(); 
     Line2D line = new Line2D.Double(x1,y1,200,200); 
     g2d.draw(line); 
    } 
    */ 
} 




} 

public class MyActionFrame extends JFrame { 

public MyActionFrame() { 
    super("Test akcji"); 

    JPanel buttonPanel = new MyButtonPanel(); 
    add(buttonPanel); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    pack(); 
    setVisible(true); 
    //setResizable(false); 
} 




public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new MyActionFrame(); 
     } 
    }); 
} 
} 

答えて

2

このvalidate();、またはより良いrevalidate();が呼び出されます。代わりにrepaint()に電話して、コンポーネントがペイントされることを示唆します。

+0

私はvalidate()をrepaint()に変更しましたが、それは同じように動作します。 –

+1

@TomaszŻuchowski、あなたはパネルではなく、ボタンを塗り直す必要があります。コードが正しく構成されていません。 JButtonを拡張する必要はありません。 X/Y変数はパネルの一部であり、ActionListenerもパネルに定義する必要があります。次に、リスナーが呼び出されたときにrepaint()を呼び出すと、ボタンのパネルではなくrepaint()がパネルに表示されます。 – camickr

+0

@camickr:それを捕まえなかったので、答えてください。 –

関連する問題