2012-02-14 119 views
3

在Java中工作:我有一個JFrame類,併爲我的兩個JPanels添加了JFrame的單獨類。其中一個JPanel類有一些按鈕,它們可以相互交互(當我點擊一個按鈕時,它可以禁用另一個按鈕)。然而,我不知道如何讓按鈕調用另一個JPanel(寫在一個單獨的類)的方法。在多個類中的Java按鈕操作

所以,我的計劃是這樣的:

的JFrame

  • JPANEL1
  • Jpanel2 - 這個類有我的按鈕在裏面,我試圖讓他們與JPANEL1對象交互。

任何提示讚賞,謝謝!

+2

顯示你的代碼會很有用。發佈[SSCCE](http://sscce.org)會更好。 – Jeffrey 2012-02-14 01:29:11

+1

你可能不應該有1個'JFrame'和2個'JPanel' *類* * *個* *(標準組件)。此外,它會支付使您的類/實例名稱不太抽象,因爲面板1可能是'userDetails',面板2可能是'userControls',這使我們更好地瞭解最終目標是什麼,從而更好地提供最佳建議的機會。 – 2012-02-14 02:07:26

回答

5

這樣做的一種方法是將Jpanel1的實例(使用您的術語)Jpanel1傳遞給Jpanel2。這不必在構造函數中完成,例如,可以有一個setConnectedPanel(JPanel)方法。

下面是一些代碼,演示了你想做的事:

MyFrame.java

import java.awt.GridLayout; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class MyFrame extends JFrame { 

    public MyFrame() { 
    ReactionPanel rp = new ReactionPanel(); 
    ActionPanel ap = new ActionPanel(rp); 
    setLayout(new GridLayout(2, 1)); 
    add(ap); 
    add(rp); 
    pack(); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

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

ActionPanel.java

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JPanel; 

public class ActionPanel extends JPanel implements ActionListener { 
    private ReactionPanel rp; 
    private JButton button; 

    public ActionPanel(ReactionPanel rp) { 
    this.rp = rp; 
    button = new JButton("Click"); 
    button.addActionListener(this); 
    this.add(button); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    if(e.getSource().equals(button)) { 
     rp.react(); 
    } 
    } 
} 

ReactionPanel.java

import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class ReactionPanel extends JPanel { 
    private JLabel label; 

    public ReactionPanel() { 
    label = new JLabel("PING"); 
    this.add(label); 
    } 

    public void react() { 
    if(label.getText().equals("PING")) { 
     label.setText("PONG"); 
    } else { 
     label.setText("PING"); 
    } 
    } 
} 

正如你所看到的,當我編寫Swing GUI時,我傾向於覆蓋所有的JFrames/JPanels,因爲我發現它更容易,更靈活,但是YMMV。

+0

謝謝!這完美地回答了我的問題! – Zargontapel 2012-02-14 02:31:37

+2

不用擔心。如果它完全回答你的問題,你應該點擊這個答案旁邊的綠色勾號。 :) – Catchwa 2012-02-14 03:23:04