2012-11-02 31 views
1

我試圖在JFrame窗口中用鼠標畫線,當我嘗試這樣做時,它不起作用!請忽略菜單,我正在嘗試以後再做這些事情!我錯過了什麼!如果你能給我一些提示,我將不勝感激!SWING - 繪製直線,編譯時不會出現

public class newGUI extends JFrame implements ActionListener, MouseMotionListener, MouseListener { 
private static final long serialVersionUID = 1L; 
public static final int WIDTH = 300; 
public static final int HEIGHT = 200; 
Point point1; 
Point point2; 
Line2D line2d; 

public static void main(String[] args){ 
    newGUI gui = new newGUI(); 
    gui.setVisible(true); 
} 

public newGUI() 
{ 
    super("Menu Demonstration"); 
    setSize(WIDTH, HEIGHT); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JMenu colorMenu = new JMenu("Choose Colors"); 
    JMenuItem greenChoice = new JMenuItem("GREEN"); 
    greenChoice.addActionListener(this); 
    colorMenu.add(greenChoice); 
    JMenuItem redChoice = new JMenuItem("RED"); 
    colorMenu.add(redChoice); 
    JMenuBar bar = new JMenuBar(); 
    bar.add(colorMenu); 
    setJMenuBar(bar); 
    addMouseListener(this); 
    addMouseMotionListener(this); 
} 
@Override 
public void actionPerformed(ActionEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseClicked(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseEntered(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseExited(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mousePressed(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
    point1=arg0.getPoint(); 
} 

@Override 
public void mouseReleased(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseDragged(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
    point2=arg0.getPoint(); 
    line2d=new Line2D.Double(point1, point2); 
    repaint(); 

} 

@Override 
public void mouseMoved(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 
public void paintComponent(Graphics g){ 
    Graphics2D g2d = (Graphics2D) g; 
    if(point1!=null && point2!=null){ 
     g2d.setPaint(Color.RED); 
     g2d.setStroke(new BasicStroke(1.5f)); 
     g2d.draw(line2d); 
     repaint(); 
    } 
} 
} 
+0

加上'@ Override'到的paintComponent,你應該明白爲什麼它不工作。 –

+0

好的...所以我實際上需要一個JPanel來創建這樣一個圖形(我至少需要繼承一個擴展JPanel的類)。任何建議?我應該上2節課嗎?我沒有任何想法... –

+0

一般而言,每個班級應具有有限的一組功能。是的,你應該分兩堂課。一個擴展JPanel或JComponent,另一個設置並顯示包含此面板的JFrame。 –

回答

5
  • 始終以大寫字母開頭的類名即NewGui
  • 使用Event Dispatch Thread用於創建和UI組件的變化
  • 不要延長JFrame類uncecessarily
  • 不要叫setSize(..)而調用JFrame#pack()JFrame實例
  • JFrame沒有paintComponent(..),而添加自定義JPanel並覆蓋其paintComponent(..)getPreferredSize(..)
  • 不要忘記調用super.paintComponent(..)在自定義JPanel
  • 不要從paintComponent(..)repaint()(這將導致比需要重新繪製更多的無限循環)
  • 也儘可能(如果它不使用其他類)使用匿名MouseListener S/MouseMotionListener S和而使用MouseAdapter代替MouseListener/MouseMotionListener小號等

這裏是我做出了榜樣(基本上與修復你的代碼中提到):

enter image description here

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.geom.Line2D; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class NewGui implements ActionListener { 

    private static final long serialVersionUID = 1L; 
    public static final int WIDTH = 300; 
    public static final int HEIGHT = 200; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       NewGui gui = new NewGui(); 
      } 
     }); 
    } 

    public NewGui() { 
     initComponents(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 
    } 

    private void initComponents() { 
     JFrame frame = new JFrame("Menu Demonstration"); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JMenu colorMenu = new JMenu("Choose Colors"); 
     JMenuItem greenChoice = new JMenuItem("GREEN"); 
     greenChoice.addActionListener(this); 
     colorMenu.add(greenChoice); 
     JMenuItem redChoice = new JMenuItem("RED"); 
     colorMenu.add(redChoice); 
     JMenuBar bar = new JMenuBar(); 
     bar.add(colorMenu); 
     frame.setJMenuBar(bar); 

     frame.add(new MyPanel()); 

     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

class MyPanel extends JPanel { 

    Point point1; 
    Point point2; 
    Line2D line2d; 

    public MyPanel() { 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent me) { 
       super.mousePressed(me); 
       point1 = me.getPoint(); 
      } 
     }); 
     addMouseMotionListener(new MouseAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent me) { 
       super.mouseDragged(me); 
       // TODO Auto-generated method stub 
       point2 = me.getPoint(); 
       line2d = new Line2D.Double(point1, point2); 
       repaint(); 
      } 
     }); 
    } 

    //so our panel will be visible 
    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 200); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 

     //Set anti-alias! 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 

     if (point1 != null && point2 != null) { 
      g2d.setPaint(Color.RED); 
      g2d.setStroke(new BasicStroke(1.5f)); 
      g2d.draw(line2d); 
     } 
    } 
} 
+1

非常感謝你!這是一個非常棒的反饋,它不僅糾正了我的錯誤,而且幫助我在將來避開它們!謝謝! –

+1

'paintComponent()'應該調用'super.paintComponent()'。事實上不可能覆蓋JFrame的'paintComponent()',因爲JFrame沒有'paintComponent()'方法。 –

+0

@madalinac。只有一種樂趣,很高興能成爲幫助 –