Hallo zusammen,
ich programmiere schon eine Weile Java-Programme und bin immer froh, wenn ich keine GUI benötige
Die Möglichkeiten eine GUI zu gestalten sind in swing mannigfaltig, aber es ist mir noch nie gelungen
eine zufriedenstellende Lösung zu implementieren.
Da ich ungern unzufrieden bin brauche ich eure Hilfe um dieses Thema engültig richtig zu verstehen und dann auch etwas ansprechendes hinzubekommen.
Genug der Vorrrede, gehen wir ins Detail.
Ich verwende gerne das GridLayout, wenn ich die einzelnen Komponenten vorausberechnen kann.
Nehmen wir als Beispiel eine Matrix aus 3x3 JLabel.
Diese wird initiiert und jedes Label bekommt eine voreingestelle Größe.
Zur Laufzeit bleibt die Höhe (height) immer gleich, die Breite (width soll sich aber ändern können).
Warum ?
Zur Laufzeit wird unterschiedlich langer Text mit setText gesetzt. Der gesamte Text (dessen Länge vorher nur größenordnungsmässig bekannt ist ,
also sowas wie "unter 50 Zeichen") soll sichtbar sein, also muss das JLabel breiter werden, wenn der Text neu gesetzt wird.
Ob sich dann die anderen JLabels ebenfalls in der Größe ändern wäre egal. Falls die Gesamtbreite der Matrix (bzw hier im Beispiel eine Zeile der Matrix)
sich ändert, auch egal, dann wird halt gescrollt.
Das klappt auch gut ..
Aber die automatische Änderung der JLabel gar nicht.
Hier mal ein Codeschnipsel, der demonstriert, was ich bisher versucht habe:
[CODE lang="java" title="Eine Zeile der Matrix"]final static int maxGap = 20;
private static Font myFont = new Font("SansSerif", Font.BOLD, 12);
GridLayout panelLayout = new GridLayout(0,columns+1);
JPanel line = new JPanel();
// Ich weiß vorher nicht, wie breit die Zeile wird, columns kann "fast" beliebig sein, daher wird hier einfach mal etwas gesetzt, was irgendwie passt
line.setSize(1000, 100);
line.setLayout(panelLayout);
line.setBorder(raisedetched);
// Eine spalte mehr, da ich noch eine Nummerirerung der Zeilen voranstelle
for (int i = 0;i<= columns;i++)
{
//Nummerierung
if (i == 0)
{
l = new JLabel(LText);
l.setBackground(Color.darkGray);
l.setForeground(Color.white);
}
else // variable Texte in den JLabel
// hier müsste eigentlich die Variabilität schon als Eigenschaft reiinkommen, aber wie ?
{
l = new JLabel(Integer.toString(i)); // Nur der "Init-Text, zur Laufzeit wird es länger"
l.setBackground(Color.gray);
}
l.setOpaque(true);
// irgendeien Schätzwert, der sich bewährt hat, empirisch ermittelt
l.setPreferredSize(new Dimension((int)(buttonSize.getWidth() )+maxGap,
(int)(buttonSize.getHeight()*0.5 )+maxGap));
l.setFont(myFont);
l.setBorder(blackline);
line.add(l);
}[/CODE]
So, zur Laufzeit passiert daann folgendes, ein String (nehemn wir an 20 Zeichen) soll via setText
gesetzt werden (klappt, da ich mir die JLabels in einem Array "merke" und dann einfach indiziert
auf das jeweilige JLabel zugreife.
Es passiert also nichts weiter ausser folgendes,
meine bisher untauglichen Versuche brauche ich nicht zu zeigen ...:
Wie bekomme ich das so hin, dass sich die JLabel in der Breite anpassen,
(und das JPanel line dann notwendigerwese auch) ?
Ups, was nicht zu vergessen ist .. wo kommt die Matrix dann wie hin:
Der entsprechende Code wäre/ist ungefähr so:
Ich hoffe/denke, dass das für einige von euch trivial ist und ihr mir auf die Sprünge helft.
Viele Grüße und bleibt gesund
Harry
ich programmiere schon eine Weile Java-Programme und bin immer froh, wenn ich keine GUI benötige
Die Möglichkeiten eine GUI zu gestalten sind in swing mannigfaltig, aber es ist mir noch nie gelungen
eine zufriedenstellende Lösung zu implementieren.
Da ich ungern unzufrieden bin brauche ich eure Hilfe um dieses Thema engültig richtig zu verstehen und dann auch etwas ansprechendes hinzubekommen.
Genug der Vorrrede, gehen wir ins Detail.
Ich verwende gerne das GridLayout, wenn ich die einzelnen Komponenten vorausberechnen kann.
Nehmen wir als Beispiel eine Matrix aus 3x3 JLabel.
Diese wird initiiert und jedes Label bekommt eine voreingestelle Größe.
Zur Laufzeit bleibt die Höhe (height) immer gleich, die Breite (width soll sich aber ändern können).
Warum ?
Zur Laufzeit wird unterschiedlich langer Text mit setText gesetzt. Der gesamte Text (dessen Länge vorher nur größenordnungsmässig bekannt ist ,
also sowas wie "unter 50 Zeichen") soll sichtbar sein, also muss das JLabel breiter werden, wenn der Text neu gesetzt wird.
Ob sich dann die anderen JLabels ebenfalls in der Größe ändern wäre egal. Falls die Gesamtbreite der Matrix (bzw hier im Beispiel eine Zeile der Matrix)
sich ändert, auch egal, dann wird halt gescrollt.
Das klappt auch gut ..
Aber die automatische Änderung der JLabel gar nicht.
Hier mal ein Codeschnipsel, der demonstriert, was ich bisher versucht habe:
[CODE lang="java" title="Eine Zeile der Matrix"]final static int maxGap = 20;
private static Font myFont = new Font("SansSerif", Font.BOLD, 12);
GridLayout panelLayout = new GridLayout(0,columns+1);
JPanel line = new JPanel();
// Ich weiß vorher nicht, wie breit die Zeile wird, columns kann "fast" beliebig sein, daher wird hier einfach mal etwas gesetzt, was irgendwie passt
line.setSize(1000, 100);
line.setLayout(panelLayout);
line.setBorder(raisedetched);
// Eine spalte mehr, da ich noch eine Nummerirerung der Zeilen voranstelle
for (int i = 0;i<= columns;i++)
{
//Nummerierung
if (i == 0)
{
l = new JLabel(LText);
l.setBackground(Color.darkGray);
l.setForeground(Color.white);
}
else // variable Texte in den JLabel
// hier müsste eigentlich die Variabilität schon als Eigenschaft reiinkommen, aber wie ?
{
l = new JLabel(Integer.toString(i)); // Nur der "Init-Text, zur Laufzeit wird es länger"
l.setBackground(Color.gray);
}
l.setOpaque(true);
// irgendeien Schätzwert, der sich bewährt hat, empirisch ermittelt
l.setPreferredSize(new Dimension((int)(buttonSize.getWidth() )+maxGap,
(int)(buttonSize.getHeight()*0.5 )+maxGap));
l.setFont(myFont);
l.setBorder(blackline);
line.add(l);
}[/CODE]
So, zur Laufzeit passiert daann folgendes, ein String (nehemn wir an 20 Zeichen) soll via setText
gesetzt werden (klappt, da ich mir die JLabels in einem Array "merke" und dann einfach indiziert
auf das jeweilige JLabel zugreife.
Es passiert also nichts weiter ausser folgendes,
meine bisher untauglichen Versuche brauche ich nicht zu zeigen ...:
Java:
// das könnte das 3. oder letzte JLabel aus dem Code von "oben" sein.
label.setText("ein langer String der anzuzeigen ist");
// danach sollte das Label den gesamten Text anzeigen
Wie bekomme ich das so hin, dass sich die JLabel in der Breite anpassen,
(und das JPanel line dann notwendigerwese auch) ?
Ups, was nicht zu vergessen ist .. wo kommt die Matrix dann wie hin:
Der entsprechende Code wäre/ist ungefähr so:
Java:
public JPanel createLableLinePanel(int rows,int columns)
{
JPanel taskViewer = new JPanel());
taskViewer().setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
// ?
//c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 0;
for (int i=0;i<rows;i++)
{
// labelLine.createLabelLine ist im Grunde der Code von oben und erstellt ein JPanel aus columns JLabels
// und ein wenig nicht swing-Brimborium
taskViewer().add(i,labelLine.createLabelLine(columns,i,formatedInt(i+1,3,true)));
}
return(taskViewer());
}
Ich hoffe/denke, dass das für einige von euch trivial ist und ihr mir auf die Sprünge helft.
Viele Grüße und bleibt gesund
Harry