Hallo,
ich habe ein Problem beim Setzen eines JPanels(SmliesPanel) innerhalb eines JFrames(TestClient).
Auf diesem JPanel(SmliesPanel) befinden neun JLabels(SmlieLabel), und auf jedem
JLabel(SmlieLabel) ist ein Icon aufgesetzt.
Das Problem liegt jetzt darin, dass mir das erste Icon auf dem SmilieLabel nicht angezeigt wird - das
passiert bei fast(!) jedem Start des Programms - das ist gerade, was ich nicht verstehe.
Die Klasse des TestClient sieht so aus: (ich schreibe hier bewusst alles bis einschliesslich des
Konstruktors hin, denn hier scheint irgendwo der Fehler zu sein, vermute ich)
Das ist der Code der Klasse SmliesPanel
Das der Code der Klasse SmlieLabel
Ich habe das ganze auch schon so getestet, dass ich SmiliesPanel nicht von JPanel sondern von
JFrame ableite, add(..) durch getContentPane().add(...) ersetze, und diese Klasse eigentständig
starte. Dabei werden immer alle Smlies angezeigt.
Das ist auch der Grund, weshalb ich von TestClient bis einschliesslich des Konstruktors den Code
poste, denn es scheint mir, wie gesagt, dass sich dort der Fehler findet. Oder habe ich etwas
absolut übersehen? ???:L
Für Hilfe vielen Dank im voraus!
P.S: Ich hoffe der Code ist nicht zu umständlich geschrieben
---------------
visit: http://www.dominic.greengecko.org
JGuiHelper 1.2, für das einfache Layout-Erstellen, zum Download ;-)
ich habe ein Problem beim Setzen eines JPanels(SmliesPanel) innerhalb eines JFrames(TestClient).
Auf diesem JPanel(SmliesPanel) befinden neun JLabels(SmlieLabel), und auf jedem
JLabel(SmlieLabel) ist ein Icon aufgesetzt.
Das Problem liegt jetzt darin, dass mir das erste Icon auf dem SmilieLabel nicht angezeigt wird - das
passiert bei fast(!) jedem Start des Programms - das ist gerade, was ich nicht verstehe.
Die Klasse des TestClient sieht so aus: (ich schreibe hier bewusst alles bis einschliesslich des
Konstruktors hin, denn hier scheint irgendwo der Fehler zu sein, vermute ich)
Code:
public final class TestClient extends JFrame {
private FontColorPanel fontColorPanelBlack; //Schriftfarbe des Users.
private SmilieLabel smilieLabel; //Smilie auf dem JLabel.
private DefaultStyledDocument document; //für die Farben der User notwendig
private JTextPane shownText;
private JList shownUsers;
private DefaultListModel listModel;
protected static JTextField usersText;
private JScrollPane scrollUsers, scrollText;
private JViewport viewport;
private Container c;
private JPanel blue, red, green, black, orange, yellow, pink, cyan, magenta;
private JPanel fontPanel; //zur FarbAuswahl
private Vector colorVector;
protected static Color color;
private SmiliesPanel smiliesPanel; //auf dieses werden die SmilieLabel gesetzt.
public TestClient() {
smiliesPanel = new SmiliesPanel(); //auf dieses werden die Smilies gesetzt.
document = new DefaultStyledDocument();
fontPanel = new JPanel(); //ein JPanel (mit aufgesetzten JPanels) für die Schriftfarben zur Auswahl.
fontPanel.setBorder(BorderFactory.createTitledBorder("Textfarben:"));
fontPanel.setLayout(new GridLayout(3, 3, 0, 0));
fontColorPanelBlack = new FontColorPanel(Color.black);
fontPanel.add(new FontColorPanel(Color.blue));
fontPanel.add(new FontColorPanel(Color.red));
fontPanel.add(new FontColorPanel(Color.green));
fontPanel.add(new FontColorPanel(Color.orange));
fontPanel.add(fontColorPanelBlack); //als Standard für loweredPanel
fontPanel.add(new FontColorPanel(Color.yellow));
fontPanel.add(new FontColorPanel(Color.pink));
fontPanel.add(new FontColorPanel(Color.cyan));
fontPanel.add(new FontColorPanel(Color.magenta));
c = this.getContentPane();
c.setLayout(null);
shownText = new JTextPane(document); //Alle Änderungen vollziehen sich am Dokument.
shownText.setEditable(false);
scrollText = new JScrollPane(shownText, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
viewport = scrollText.getViewport();
listModel = new DefaultListModel();
shownUsers = new JList(listModel);
scrollUsers = new JScrollPane(shownUsers, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollUsers.setBounds(540, 30, 180, 160);
usersText = new JTextField();
usersText.addActionListener(this);
scrollText.setBounds(30, 30, 500, 400);
smiliesPanel.setBounds(540, 200, 200, 130);
fontPanel.setBounds(540, 340, 195, 90);
usersText.setBounds(30, 460, 500, 20);
c.add(smiliesPanel);
c.add(scrollText);
c.add(scrollUsers);
c.add(usersText);
c.add(fontPanel);
}
Das ist der Code der Klasse SmliesPanel
Code:
public class SmiliesPanel extends JPanel {
private SmilieLabel[] smilieLabels = new SmilieLabel[9]; //Jedes Smilie auf ein JLabel.
private String[] images = {"smilies/gruebel.gif", "smilies/hand.gif", "smilies/keks_2.gif",
"smilies/loel.gif", "smilies/kopfstand.gif", "smilies/verlegen.gif",
"smilies/smile.gif", "smilies/gaehn.gif", "smilies/respekt.gif"};
private String[] description = {"*gruebel*", "*wink*", "*keks*", "*krumlach*", "*kopfstand*",
"*verlegen*", "*smile*", "*gaehn*", "*respekt*"};
public SmiliesPanel () {
this.setBorder(BorderFactory.createTitledBorder("Smilies:"));
this.setLayout(new GridLayout(3, 3));
for(int i=0; i<9; i++) {
smilieLabels[i] = new SmilieLabel(images[i], description[i]);
this.add(smilieLabels[i]);
}
}
}
Das der Code der Klasse SmlieLabel
Code:
public class SmilieLabel extends JLabel {
private MediaTracker mediaTracker;
private Image smilie;
private ImageIcon imageIcon;
private String description; //z.B. "*grübel*"
public SmilieLabel(String imagePath, String description) {
mediaTracker = new MediaTracker(this);
smilie = Toolkit.getDefaultToolkit().getImage(imagePath); //SmilieLaden.
System.out.println(imagePath);
mediaTracker.addImage(smilie, 0);
try {
mediaTracker.waitForAll();
} catch(InterruptedException ie) {
System.out.println(ie.toString());
}
imageIcon = new ImageIcon(smilie, description);
System.out.println(imageIcon.toString());
this.setIcon(imageIcon);
System.out.println(imageIcon);
}
}
Ich habe das ganze auch schon so getestet, dass ich SmiliesPanel nicht von JPanel sondern von
JFrame ableite, add(..) durch getContentPane().add(...) ersetze, und diese Klasse eigentständig
starte. Dabei werden immer alle Smlies angezeigt.
Das ist auch der Grund, weshalb ich von TestClient bis einschliesslich des Konstruktors den Code
poste, denn es scheint mir, wie gesagt, dass sich dort der Fehler findet. Oder habe ich etwas
absolut übersehen? ???:L
Für Hilfe vielen Dank im voraus!
P.S: Ich hoffe der Code ist nicht zu umständlich geschrieben
---------------
visit: http://www.dominic.greengecko.org
JGuiHelper 1.2, für das einfache Layout-Erstellen, zum Download ;-)