2013-05-02 55 views
0

我正在爲一個項目編寫一個IM客戶端GUI。在窗口的左側,我想要一個滾動窗格,其中每個活動用戶都有單選按鈕,這樣當按下新聊天按鈕時,將與選定用戶創建聊天。未出現自定義JScrollPane中的JRadioButtons?

我已經實現了3個給定用戶的示例GUI。我爲每個創建一個JRadioButton,設置一個ActionCommand和一個ActionListener,將它添加到ButtonGroup中,然後將它添加到'this',這是一個擴展JScrollPane的類。但是,當我運行代碼時,我只看到左側有一個空框,沒有按鈕。有人可以解釋嗎?相關代碼如下。

package gui; 
import javax.swing.*; 

public class ActiveList extends JScrollPane implements ActionListener { 
    private ButtonGroup group; 
    private String selected; 

    public ActiveList() { 
     //TODO: will eventually need access to Server's list of active usernames 
     String[] usernames = {"User1", "User2", "User3"}; 
     ButtonGroup group = new ButtonGroup(); 
     this.group = group; 

     for (String name: usernames) { 
      JRadioButton button = new JRadioButton(name); 
      button.setActionCommand(name); 
      button.addActionListener(this); 
      this.group.add(button); 
      this.add(button); 
     } 
    } 

    public String getSelected() { 
     return this.selected; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     this.selected = e.getActionCommand(); 
     System.out.println(e.getActionCommand()); 
    } 

} 

我正在運行的主要方法來自另一個類ChatGUI.java。 ConversationsPane容器是我GUI中的另一個類,它正常工作。

package gui; 
import javax.swing.*; 

public class ChatGUI extends JFrame { 
    private ConversationsPane convos; 
    private ActiveList users; 

    public ChatGUI() { 
     ConversationsPane convos = new ConversationsPane(); 
     this.convos = convos; 
     ActiveList users = new ActiveList(); 
     this.users = users; 

     GroupLayout layout = new GroupLayout(this.getContentPane()); 
     this.getContentPane().setLayout(layout); 
     layout.setAutoCreateGaps(true); 
     layout.setAutoCreateContainerGaps(true); 

     layout.setHorizontalGroup(
      layout.createSequentialGroup() 
       .addComponent(users, 100, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) 
       .addComponent(convos) 
     ); 

     layout.setVerticalGroup(
      layout.createParallelGroup() 
       .addComponent(users) 
       .addComponent(convos) 
     ); 
    } 

    public static void main(String[] args) { 
     ChatGUI ui = new ChatGUI(); 
     ui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     ui.setVisible(true); 
     ui.setSize(800,400); 
     ui.convos.newChat("Chat A"); 
    } 
} 
+1

我會使用帶圖標的JList而不是JRadioButton,然後ListSelectionListner可以對JList中的選擇事件做出反應 – mKorbel 2013-05-02 05:39:34

+0

什麼是ConversationsPane?以[SSCCE](http://sscce.org/)的形式回答。 – 2013-05-02 05:40:41

回答

2

這不是滾動窗格的工作方式。你不會「添加」組件給他們。您可以設置一個組件在滾動窗格查看端口

enter image description here

不是擴展JScrollPane,爲您添加沒有任何價值的話,嘗試做更多的東西一樣的...

JScrollPane scrollPane = new JScrollPane(); 
JPanel view = new JPanel(new GridLayout(0, 1)); 
String[] usernames = {"User1", "User2", "User3"}; 
ButtonGroup group = new ButtonGroup(); 
this.group = group; 

for (String name: usernames) { 
    JRadioButton button = new JRadioButton(name); 
    button.setActionCommand(name); 
    button.addActionListener(this); 
    this.group.add(button); 
    view.add(button); 
} 

scrollPane.setViewportView(view); 
// Add scrollpane to WEST position of main view 

相反...

看看How to use scroll panes瞭解更多詳情...

+0

這很有道理!在發佈之前,我已經看到這個鏈接使用了我的問題,但是不能從中理解,但是你寫出來的方式使它更加清晰。我會嘗試這樣實現它! – user2048643 2013-05-02 05:44:04

+0

它的工作原理!我最終使ActiveList擴展JPanel併成爲你的例子中的「視圖」,然後創建一個JScrollPane並在ChatGUI的構造函數中設置視口。非常感謝! – user2048643 2013-05-02 05:50:39

+0

@ user2048643 Yee第一次工作答案:D – MadProgrammer 2013-05-02 06:14:07

1

而不是擴展JScrollPane擴展JPanel與適當的佈局。將JRadioButtons添加到面板並將面板放置在JScrollPane中。

相關問題