我很难弄清楚如何将arraylist添加到使用内置Netbeans Swing生成的Jlist中。
我的目标是每次客户端加入频道时都会自动更新一个列表,就像IRC一样,同时包含客户列表和频道列表。
Atm我有以下方法,允许人们加入频道,聊天,离开,耳语等。
所以,我已经在ListModel类上读了一些内容,但是我在确定哪个类应该添加listmodel时遇到了一些问题。
客户列表是arraylist,但是channellist是一个哈希表。当我进入一个频道时,我想让所有的客户都在同一个频道内。那段代码怎么样?
Btw,代码主要是挪威语。如果这是一个问题,请告诉我,并将其翻译出来。class ChatFrontImpl extends UnicastRemoteObject implements ChatFront {
private BrukerDAO b = new BrukerDAO();
private Hashtable<String, ArrayList<String>> kanaler = new Hashtable<String, ArrayList<String>>();
private ArrayList<Klient> klientene = new ArrayList<Klient>();
public ChatFrontImpl() throws RemoteException {
}
public synchronized boolean registrerMeg(Klient klient, String passord) throws RemoteException {
if(!b.loggInn(klient.finnNavn(), passord)){
System.out.println("feil brukernavn eller passord");
return false;
}
if (!klientene.contains(klient)) {
try {
klientene.add(klient);
System.out.println("Na er " + klient.finnNavn() + " registrert.");
} catch (Exception e){
System.out.println("Feil oppstatt i registrerMeg(): " + e);
}
return true;
} else
return false;
}
public String kobleTilKanal(String brukernavn, String kanal) throws RemoteException{
if(erBrukerRegistrert(brukernavn)){
if (!kanaler.containsKey(kanal)) {
String melding = "Bruker " + brukernavn + " har ankommet kanalen";
kanaler.put(kanal, new ArrayList<String>());
kanaler.get(kanal).add(brukernavn);
varsleKanalSystem(kanal, "SYSTEM", melding);
varsleSelv(brukernavn, "Skriv /? for mulige kommandoer");
return("Kanal opprettet, og bruker satt i kanalen.");
}
else{
if(kanaler.get(kanal).contains(brukernavn)){
return ("Brukeren er allerede i kanalen.");
} else {
kanaler.get(kanal).add(brukernavn);
String melding = "Bruker " + brukernavn + " har ankommet kanalen";
varsleKanalSystem(kanal, "SYSTEM", melding);
return ("Kanal fantes allerede. Bruker satt i kanalen.");
}
}
}
return "";
}
public String kobleFraKanal(String brukernavn, String kanal) throws RemoteException{
if(finnesBrukerIKanalX(brukernavn, kanal)){
kanaler.get(kanal).remove(brukernavn);
String melding = "Bruker " + brukernavn + " har forlatt kanalen.";
varsleSelv(brukernavn, " Du har nå forlatt kanalen " + kanal);
varsleKanalSystem(kanal, "SYSTEM", melding);
if(kanaler.get(kanal).isEmpty()){
kanaler.remove(kanal);
}
}
return ("Bruker har forlatt kanalen.");
}
我也有一个GUILogic类,从ChatFrontImpl类中获取一些方法,并建立与RMI服务器的连接。
然后是由Netbeans制作的GUI类。
import java.awt.Color;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
/**
*
* @author sindre
*/
public class GUI extends javax.swing.JFrame {
GUILogikk gl = new GUILogikk(this);
/** Creates new form GUI */
public GUI() throws RemoteException, Exception {
initComponents();
String brukernavn = JOptionPane.showInputDialog("Hva er ditt brukernavn?");
gl.setBrukernavn(brukernavn);
String passord = JOptionPane.showInputDialog("Skriv inn passord.");
gl.setPassord(passord);
gl.OpprettCFKobling(brukernavn, passord);
chatFelt.setEditable(false);
skrivTekst.requestFocus();
private void KobleTilKanalActionPerformed(java.awt.event.ActionEvent evt) {
String kanal = JOptionPane.showInputDialog("Hvilken kanal vil du koble til?");
gl.setKanal(kanal);
try {
gl.kobleTilKanal(gl.getBrukernavn(), gl.getKanal());
} catch (RemoteException ex) {
System.out.println(ex);
} catch (NullPointerException ex) {
JOptionPane.showMessageDialog(rootPane, "Ingen bruker er pålogget.");
}
}
private void kobleFraKanalActionPerformed(java.awt.event.ActionEvent evt) {
String kanal = JOptionPane.showInputDialog("Hvilken kanal vil du koble fra?");
try {
gl.kobleFraKanal(gl.getBrukernavn(), kanal);
} catch (RemoteException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
} catch (NullPointerException ex) {
JOptionPane.showMessageDialog(rootPane, "Ingen bruker er pålogget.");
}
}
private void skrivTekstActionPerformed(java.awt.event.ActionEvent evt) {
String tekst = null;
tekst = skrivTekst.getText();
gl.setTekst(tekst);
try {
gl.analyserTekst(gl.getBrukernavn(), gl.getKanal(), gl.getTekst());
} catch (RemoteException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
} catch (NullPointerException ep){
try {
gl.feilmelding(gl.getBrukernavn(), "Du må være i en kanal for å kunne skrive. Bruk /join 'kanal' eller knappen til høyre for å joine en kanal");
} catch (RemoteException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
skrivTekst.setText("");
skrivTekst.requestFocus();
}
private void meldingPrivatActionPerformed(java.awt.event.ActionEvent evt) {
String til = JOptionPane.showInputDialog("Hvem vil du skrive til?");
String melding = JOptionPane.showInputDialog("Hva vil du skrive?");
try {
gl.nyMeldingPrivat(gl.getBrukernavn(), til, melding);
} catch (RemoteException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void muligeKommandoerActionPerformed(java.awt.event.ActionEvent evt) {
Object[] options = { "/Join", "/leave", "/Whisper", "/Quit", "Lukk" };
int valg = JOptionPane.showOptionDialog(rootPane, "Hva vil du gjøre? ", null, WIDTH, WIDTH, null, options, rootPane);
switch (valg) {
case 0:
skrivTekst.setText("/Join ");
skrivTekst.requestFocus();
break;
case 1:
skrivTekst.setText("/Leave ");
skrivTekst.requestFocus();
break;
case 2:
skrivTekst.setText("/Whisper ");
skrivTekst.requestFocus();
break;
case 3:
skrivTekst.setText("/Quit");
skrivTekst.requestFocus();
break;
case 4:
skrivTekst.requestFocus();
break;
}
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(DISPOSE_ON_CLOSE);
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
gl.hentAktiveKanaler(gl.getBrukernavn());
} catch (RemoteException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void nyMeldingKanal(String fraBruker, String tilKanal, String melding) throws RemoteException {
chatFelt.append(fraBruker + "(" + tilKanal + ")" + ": " + melding + "\n");
chatFelt.setCaretPosition(chatFelt.getText().length());
}
public void nyMeldingPrivat(String fra, String til, String melding) {
chatFelt.append(fra + "sier: " + melding + "\n");
chatFelt.setCaretPosition(chatFelt.getText().length());
}
public void nyMeldingSystem(String fraBruker, String tilKanal, String melding){
chatFelt.setForeground(Color.red);
chatFelt.append(fraBruker + "(" + tilKanal + ")" + ": " + melding + "\n");
chatFelt.setCaretPosition(chatFelt.getText().length());
}
public void feilmelding(String til, String melding){
chatFelt.append("" + melding + "\n");
chatFelt.setCaretPosition(chatFelt.getText().length());
}
}
// Variables declaration - do not modify
private javax.swing.JButton KobleTilKanal;
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.JTextArea chatFelt;
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JComboBox jComboBox1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLayeredPane jLayeredPane1;
private javax.swing.JLayeredPane jLayeredPane2;
private javax.swing.JList jList1;
private javax.swing.JList jList2;
private javax.swing.JPopupMenu jPopupMenu1;
private javax.swing.JPopupMenu jPopupMenu2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JButton kobleFraKanal;
private javax.swing.JButton meldingPrivat;
private javax.swing.JButton muligeKommandoer;
private javax.swing.JTextField skrivTekst;
// End of variables declaration
}
答案 0 :(得分:1)
定义DefaultListModel可通过所有Java方法和类访问,DefaultListModel可以保存您的对象,例如JList中有JDialog,
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
// based on @trashgod code
/** @see http://stackoverflow.com/questions/5759131 */
public class ListDialog {
private static final int N = 12;
private JDialog dlg = new JDialog();
private DefaultListModel model = new DefaultListModel();
private JList list = new JList(model);
private JScrollPane sp = new JScrollPane(list);
private int count;
public ListDialog() {
list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
JPanel panel = new JPanel();
panel.add(new JButton(new AbstractAction("Add") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
append();
if (count <= N) {
list.setVisibleRowCount(count);
dlg.pack();
}
}
}));
panel.add(new JButton(new AbstractAction("Remove") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
int itemNo = list.getSelectedIndex();
if (itemNo > -1) {
removeActionPerformed(e, itemNo);
}
}
}));
for (int i = 0; i < N - 2; i++) {
this.append();
}
list.setVisibleRowCount(N - 2);
dlg.add(sp, BorderLayout.CENTER);
dlg.add(panel, BorderLayout.SOUTH);
dlg.pack();
dlg.setLocationRelativeTo(null);
dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dlg.setVisible(true);
}
private void removeActionPerformed(ActionEvent e, int itemNo) {
System.out.println("made_list's model: " + list.getModel());
System.out.println("Model from a fresh JList: " + new JList().getModel());
model = (DefaultListModel) list.getModel();
if (model.size() > 0) {
if (itemNo > -1) {
model.remove(itemNo);
}
}
}
private void append() {
model.addElement("String " + String.valueOf(++count));
list.ensureIndexIsVisible(count - 1);
}
public static void main(String[] a_args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ListDialog pd = new ListDialog();
}
});
}
}