2013-07-23 43 views
-1

所以,我有我的主要類延伸JFrame,我有第二課延伸JPanel允許paintComponent借鑑JPanel。但是,如何訪問新課程以繪製JPanel如何從Java中的其他類訪問paintComponent()?

這裏是我的代碼:

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

public class MTGSAMPServerReference extends JFrame implements ActionListener { 
    public static Toolkit tk = Toolkit.getDefaultToolkit(); 
    static int ScrnWidth = ((int) tk.getScreenSize().getWidth()); 
    static int ScrnHeight = ((int) tk.getScreenSize().getHeight()); 
    private static final long serialVersionUID = 1L; 
    private static JList list1; 
    private static JButton next; 
    private static JPanel bg = new JPanel(); 

    public MTGSAMPServerReference() { 
     // set flow layout for the frame 
     this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING)); 
     Object[]mainData = {"Vehicles", "Bikes/Bicycles", "Boats", "Houses", "Businesses", "Objects", "Jobs", "Ranks", "Licenses", "VIP"}; 
     JPanel controls = new JPanel(new BorderLayout(5,5)); 
     list1 = new JList<Object>(mainData); 
     list1.setVisibleRowCount(10); 
     next = new JButton("Next"); 
     next.addActionListener(this); 
     controls.add(new JScrollPane(list1)); 
     controls.add(next, BorderLayout.PAGE_END); 
     controls.setBorder(new EmptyBorder(25,25,0,0)); 
     add(controls); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getActionCommand().equals("Next")) { 
      int index = list1.getSelectedIndex(); 
      System.out.println("Index Selected: " + index); 
      String s = (String) list1.getSelectedValue(); 
      System.out.println("Value Selected: " + s); 
     } 
    } 

    public void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame f = new MTGSAMPServerReference(); 
     //Display the window. 
     f.pack(); 
     f.setVisible(true); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     f.setSize(1200, 800); 
     f.setLocationRelativeTo(null); 
     list1.setSize(250, 250); 
     list1.setLocation(0, 0); 
     next.setSize(75, 25); 
     next.setLocation(251, 276); 
     MTGSAMPServerReference.this.repaint(); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
      MTGSAMPServerReference gui = new MTGSAMPServerReference(); 
      gui.createAndShowGUI(); 
      } 
     }); 
    } 
} 

class drawOnPanel extends JPanel { 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D)g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.drawRect(0, 0, 50, 50); 
    } 
} 

任何想法?

在此先感謝!

+0

哦,佈局問題解決了! – Azad

+0

你似乎正忙於讓在線社區爲你編寫應用程序。這個程序是什麼?我見過幾個與之相關的帖子。 – tbodt

+0

@tbodt不,我只是想學習,當我遇到問題時,我會搜索它,做一些研究,看看我可以自己做些什麼。當我撞牆時,我會尋求幫助。最近雖然它不僅僅是一面牆,而且更像一座塔:我只需要能夠克服這個障礙,然後我應該變成金色! – knorberg

回答

3

您只需像添加任何其他組件一樣添加面板即可。當需要重繪時,調用paintComponent方法。

+0

但是,如何從不同的類訪問它? – knorberg

+0

爲什麼你想讓它從另一個班上被訪問?你可以通過容器調用它來繪製它。 – tbodt

+0

你看我的代碼嗎? – knorberg

3

您沒有將drawOnPanel類添加到框架的容器中。加入這一行:

add(new drawOnPanel()); 

其他注意事項

  1. 裏面createAndShowGUI(),你從JFrame已經擴展分類,也沒有必要創建另一個JFrame對象,將其更改爲:

    public void createAndShowGUI() { 
        //Create and set up the window. 
        //JFrame f = new MTGSAMPServerReference(); 
        //Display the window. 
    
        setVisible(true); 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        setSize(1200, 800); 
        setLocationRelativeTo(null); 
        list1.setSize(250, 250); 
        list1.setLocation(0, 0); 
        next.setSize(75, 25); 
        next.setLocation(251, 276); 
        repaint(); 
        pack(); 
    } 
    
  2. 重新繪製後,選擇pack()方法,以適合組件的尺寸,就像我在上面所做的那樣。

@ knorberg的評論:在哪裏以及如何繪製我的矩形?

繪圖是好的,只是覆蓋getPreferredSize()方法drawOnPanel類中:

class drawOnPanel extends JPanel { 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D)g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.drawRect(0, 0, 50, 50); 
    } 
    @Override 
    public Dimension getPreferredSize(){ 
    return new Dimension(200,200); 
    } 
} 
+0

這裏和如何繪製矩形? 'g2.drawRect(0,0,50,50);' – knorberg

+0

而且,我被告知從不使用JFrame,而是使用JPanel。 – knorberg

+0

@knorberg:你的繪圖很好,只需在'drawOnPanel'類中覆蓋'getPreferredSize()'方法併爲它設置一些尺寸,如果你不知道,我會更新我的答案。 – Azad