inbuilt Netbeans Swingで生成されたJlistにarraylistを追加する方法がわかりません。JListへのArrayList。クライアントリスト channellistを持つRMI Chatプログラム
私の目標は、クライアントがチャネルに参加するたびに自動的に1つのリストを更新することです。これは、IRCと同様に、クライアントリストとチャネルリストの両方があります。
ATMは、私は人々がささやく、去る、チャット、チャンネルに参加することができ、次の方法でこれらのクラスを持っているなど
だから、私はListModelのクラスのビットを読みましたが、イムは、いくつかの問題を抱えてどのクラスでlistmodelを追加すべきかを考え出す。
クライアントリストはarraylistですが、チャンネルリストはハッシュテーブルです。私がチャンネルにいたとき、私は同じチャンネルの中にすべてのクライアントを入れたいと思っていました。そのコードはどういったものでしょうか?
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
}
はどんな人がいる場合だけでテストするには、この使用可能なtheresのですリストの部屋で? public ArrayList getAllUsersInChannel(String username、String channel)throws RemoteException { if(channels.contains(username)){ これは何を言いますか? } が返品しますか? } –
sindrem
私は正しいはずですが、RMIからこれらのメソッドを呼び出すか、SwingWorkerからRMIを呼び出すため、EDTのSwing GUIを更新してmodel.removeまたはmodel.addElementをinvokeLaterにラップする必要があります – mKorbel