我注意到有兩件事情,他們中有些人已經指出:
- 直接回答你的問題,這是何等的(X,Y)座標看起來像Swing組件this is what the (x, y) coordinates look like for Swing components http://i43.tinypic.com/16ga04i.png保持X座標相同的垂直線。如果您在創建線構造函數時不知道x座標在哪裏,請查看構造函數的文檔。如果您使用Eclipse,這意味着您應該將鼠標懸停在包含構造函數的代碼上。
- 您的線路超出了您的JFrame範圍;相反,如果您希望它從頭到尾,請使用
getWidth()
和getHeight()
方法。
- 每次重新繪製組件時,都不應該創建新行。相反,你應該在你的
Success
類的某個地方創建一條線,實現ActionListener
,這樣你就可以在每一幀更新你的代碼,並且在那個更新中,調整你的線的大小,然後只留下重繪到paintComponent
。
- 在這種情況下,您不應該覆蓋
JFrame
,您通常不應該這樣做。
- 您應該覆蓋
paintComponent
方法,而不是paint
方法。
- 我不認爲你是正確的雙緩衝,但我幫不了你。
- 覆蓋
getPreferredSize
如果你想控制它的大小,那麼JPanel的方法很方便,但在這種情況下它甚至不是必需的,因爲將它添加到JFrame會自動調整它的大小。
在Swing幕後出現很多東西,它可能會讓人困惑,因爲通常你必須明確地說出東西,但繼續玩這個例子,你應該安全一段時間。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.*;
class Success extends JPanel implements ActionListener{
private final Timer timer = new Timer(20, this); // Create a timer that will go off every 20 ms
Line2D horizontalLine; // Declare your variables here, but don't initialize them
Line2D verticalLine; // That way, they can be accessed later in actionPerformed and repaint
// You might want to try frame.setResizable(false) if you want your frame
// and your panel to stay the same size.
private final Dimension prefPanelSize = new Dimension(450, 450);
public Success(){
super(); // Call the constructor of JPanel, the class this subclasses.
JButton button =new JButton("press");
this.add(button);
this.setSize(prefPanelSize);
horizontalLine = new Line2D.Float(0, 40, prefPanelSize.width, 40);
verticalLine = new Line2D.Float(prefPanelSize.width/2, 0,
prefPanelSize.width/2, prefPanelSize.height);
timer.start(); // Start the timer
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g); // fixes the immediate problem.
Graphics2D g2 = (Graphics2D) g;
g2.draw(horizontalLine);
g2.draw(verticalLine);
}
@Override
public Dimension getPreferredSize()
{
return prefPanelSize;
}
public static void main(String []args){
Success s = new Success();
JFrame frame = new JFrame();
frame.setVisible(true);
frame.setSize(new Dimension(450, 450));
frame.add(s);
}
// This method is called ever 20 ms because of the timer.
@Override
public void actionPerformed(ActionEvent e) {
int currWidth = getWidth();
int currHeight = getHeight();
horizontalLine.setLine(0, 40, currWidth, 40);
verticalLine.setLine(currWidth/2, 0, currWidth/2, currHeight);
}
}
我猜你不明白圖上的X和Y軸是什麼意思? –
不要覆蓋JFrame,你不會添加任何UFC tionality。不要重寫paint,尤其是JFrame,它是一個非常複雜的組件,它很容易填充paint鏈,也不是雙緩衝。改爲從JPanel擴展並重寫paontComponent。然後,您可以將其添加到JFrame的一個實例... – MadProgrammer