PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Selbstgeschriebene Skat-Software / [JAVA] Größe von Checkbox ändern?


Pinoccio
2005-03-05, 15:59:32
Hallo,

ich habe mit einem Freund zusammen ein Programm geschrieben, das uns die Rechenarbeit bei unserer wöchentlichen Skatrunde abnimmt. Die Steuerung erfolgt ausschließlich per Funk-Maus und über einen Fernseher. Damit wir etwas erkennen, haben wir allen Text extra-groß geschrieben.
Leider habe ich (bislang) keine Möglichkeit gefunden, die Checkbox-Elemente (Spielwert) und die Choice-Elemente (Weiteres) zu vergrößern, damit man besser erkennt, welche angeklickt sind.
Ein einfaches setSize(new Dimension(50,50)); (http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Component.html#setSize(java.awt.Dimension)) tut leider nix (auch mit anderen/größeren Werten). Die neue Größe wird zwar auf Anfrage zurückgegeben, aber man sieht nichts davon.

Wenn da einer eine Tip häte, würde ich mich riesig freuen!
(Nein, komplett alles verkleinern und die Auflösung ändern, damit die besagten Objekte größer erscheinen ist nicht. :-( )

mfg Sebastian

http://img25.exs.cx/img25/4334/skat4eq.th.gif (http://img25.exs.cx/img25/4334/skat4eq.gif) (Nur ein kleiner Ausschnitt)
Thanks to ImageShack for Free Image Hosting (http://www.imageshack.us)

Xmas
2005-03-05, 17:31:46
(Nein, komplett alles verkleinern und die Auflösung ändern, damit die besagten Objekte größer erscheinen ist nicht. :-( )

Es sollte auch reichen, die dpi-Einstellungen zu ändern, nicht die Bildschirmauflösung.

Ansonsten würden sich Pushbuttons oder eine Listbox statt Radiobuttons für den Spielwert anbieten. Ebenso könnten Spitzen und Spielstufen in eine Listbox (wenn ihr nach Skatordnung spielt, gibt es eh nur 9 Spielstufen).

Pinoccio
2005-03-05, 19:12:51
Es sollte auch reichen, die dpi-Einstellungen zu ändern, nicht die Bildschirmauflösung.
Ansonsten würden sich Pushbuttons oder eine Listbox statt Radiobuttons für den Spielwert anbieten. Ebenso könnten Spitzen und Spielstufen in eine Listbox (wenn ihr nach Skatordnung spielt, gibt es eh nur 9 Spielstufen).
Wie stelle ich die dpi? Nach einigem googlen scheint es mir, als wenn es generell unter JAVA sher schwer wäre, andere Bildschirmauflösungen (im Sinne unterschiedlociher dpi) als 72 dpi vernünftig zu nutzen.

Was sind Pushbuttons und Listboxes? Bin zwar kein völliger Anfänger, aber habe mich GUI-mäßig nicht mit mehr als dem AWT beschäfftig.

An sich ist das Design durchdacht, auch wenn es evtl verwirrend aussieht. Sicher könnte man alles per Choice machen, so wie die Spitzen, aber das fände ich persönlich eine unelegante und häßliche Lösung.
Streng nach Skatordnung spielen wir übrigens nicht. ;-)

mfg Sebastian

Xmas
2005-03-05, 21:32:49
Wie stelle ich die dpi? Nach einigem googlen scheint es mir, als wenn es generell unter JAVA sher schwer wäre, andere Bildschirmauflösungen (im Sinne unterschiedlociher dpi) als 72 dpi vernünftig zu nutzen.
Eigenschaften von Anzeige/Einstellungen/Erweitert/Allgemein
Standard sind in Windows 96 dpi. Ich nutze 125 dpi und hatte damit bei Java-Programmen bisher keine Probleme.

Was sind Pushbuttons und Listboxes? Bin zwar kein völliger Anfänger, aber habe mich GUI-mäßig nicht mit mehr als dem AWT beschäfftig.
Eine Listbox ist ein Kasten mit einer Liste, aus der man eine oder mehrere Zeilen auswählen kann. Sieht so aus wie der untere, ausklappbare Teil deiner "Spitzen"-Combobox. Ein Pushbutton ist einfach ein ganz normaler Button. Die kann man auch so verwenden, dass sie nach dem Klicken "gedrückt" bleiben und damit eine Auswahl anzeigen.

An sich ist das Design durchdacht, auch wenn es evtl verwirrend aussieht. Sicher könnte man alles per Choice machen, so wie die Spitzen, aber das fände ich persönlich eine unelegante und häßliche Lösung.
Streng nach Skatordnung spielen wir übrigens nicht. ;-)

mfg Sebastian
Ja, das sieht man ;) Das ausgewählte Spiel gäbe es nach Skatordnung gar nicht, ebensowenig Ramsch.

Ich würde eben versuchen, die Fläche maximal auszunutzen und so viel Fläche wie möglich für eine Auswahl "klickbar" zu gestalten.

Pinoccio
2005-03-05, 22:21:27
Eigenschaften von Anzeige/Einstellungen/Erweitert/Allgemein
Standard sind in Windows 96 dpi. Ich nutze 125 dpi und hatte damit bei Java-Programmen bisher keine Probleme.Keine Probleme reicht nicht! ;-)
JAVA nimmt diese Windowseinstellungen zwar zur Kenntnis (lässt sich ja über Toolkit.getScreenResolution() (http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Toolkit.html#getScreenResolution()) abfragen) ignoriert diese aber sonst ganz geflissentlich. Ein in vielen JAVA-Foren diskutierte Unsitte. Hätte ich gewußt, daß du das meinst ...
Hier mal Zwei Bilder zum Vergleich.
bei 120dpi, alle sieht anders aus, aber JAVA juckt's nicht
http://img198.exs.cx/img198/2614/skatbei120dpi6ge.th.gif (http://img198.exs.cx/img198/2614/skatbei120dpi6ge.gif)
bei Standardeinstellung 96dpi, ist der Screenshot von oben, nur nochmal beschnitten:
http://img198.exs.cx/img198/7087/skatstandard3fe.th.gif (http://img198.exs.cx/img198/7087/skatstandard3fe.gif)
(Wenn du einen Tabbing-fähigen Browser hast: habe sie extra so zugeschnitten, daß bei einem Tab-Wechel zu sehen ist, das sich an den Größen überhauptgarnix ändert.)
Eine Listbox ist ein Kasten mit einer Liste, aus der man eine oder mehrere Zeilen auswählen kann.
Sieht so aus wie der untere, ausklappbare Teil deiner "Spitzen"-Combobox.Ein Pushbutton ist einfach ein ganz normaler Button. Die kann man auch so verwenden, dass sie nach dem Klicken "gedrückt" bleiben und damit eine Auswahl anzeigen. Ersteres kenne ich unter anderem Namen (http://java.sun.com/j2se/1.4.2/docs/api/java/awt/List.html). Letzteres machen wir ja mehr oder weniger bei dem "Nächstes Spiel"-Button. Leider habe ich da aber keinen Enfluß auf die Farbliche Gestaltung, sondern hier wird der Windows-Standard für inaktive Buttons genommen. Würde zwar gehen (der inaktive ist der ausgewählte, alle anderen können geklickt werden).[ohne Skatordnung]Ja, das sieht man ;) Das ausgewählte Spiel gäbe es nach Skatordnung gar nicht, ebensowenig Ramsch.Was hast du an einem Pik Hand, offen und Schneider auszusetzen?Ich würde eben versuchen, die Fläche maximal auszunutzen und so viel Fläche wie möglich für eine Auswahl "klickbar" zu gestalten.Hm, das Problem der Erkennbarkeit war uns anfangs nicht so klar. Große Shcrift, ja okay, aber das die Checkbox-Kullern bzw- Häckchen so klein sind ... :-( Naja, Es steht ja immer die Punktzahl groß da, wenn was falsch geklickt wurde, sollte man es da merken.

Workaround wird wahrscheinlich, die jeweils selektierten Optionen farblich hervorzuheben. Ist bloß leider mehr arvbeit als ein (fiktives) Checkbox.setSize(50,50), daß funktioniert wie ich es will!

mfg Sebastian
*DerJetztErstmalWiederSeineBildschirmauflösungZurückstellt*

Xmas
2005-03-06, 01:18:19
Keine Probleme reicht nicht! ;-)
JAVA nimmt diese Windowseinstellungen zwar zur Kenntnis (lässt sich ja über Toolkit.getScreenResolution() (http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Toolkit.html#getScreenResolution()) abfragen) ignoriert diese aber sonst ganz geflissentlich. Ein in vielen JAVA-Foren diskutierte Unsitte. Hätte ich gewußt, daß du das meinst ...
Hier mal Zwei Bilder zum Vergleich.
bei 120dpi, alle sieht anders aus, aber JAVA juckt's nicht
http://img198.exs.cx/img198/2614/skatbei120dpi6ge.th.gif (http://img198.exs.cx/img198/2614/skatbei120dpi6ge.gif)
bei Standardeinstellung 96dpi, ist der Screenshot von oben, nur nochmal beschnitten:
http://img198.exs.cx/img198/7087/skatstandard3fe.th.gif (http://img198.exs.cx/img198/7087/skatstandard3fe.gif)
(Wenn du einen Tabbing-fähigen Browser hast: habe sie extra so zugeschnitten, daß bei einem Tab-Wechel zu sehen ist, das sich an den Größen überhauptgarnix ändert.)
Hm, zumindest der Button in der Combo-Box ist etwas breiter. Hast du nach dem Umstellen der dpi-Einstellung neu gestartet? Das könnte noch einen Unterschied machen.

Allerdings ist das ein AWT- und kein generelles Java-Problem. SWT scheint jedenfalls damit umgehen zu können, Swing hat wohl auch Probleme.

Ersteres kenne ich unter anderem Namen (http://java.sun.com/j2se/1.4.2/docs/api/java/awt/List.html). Letzteres machen wir ja mehr oder weniger bei dem "Nächstes Spiel"-Button. Leider habe ich da aber keinen Enfluß auf die Farbliche Gestaltung, sondern hier wird der Windows-Standard für inaktive Buttons genommen. Würde zwar gehen (der inaktive ist der ausgewählte, alle anderen können geklickt werden).
Hm, kann man bei AWT die Buttons nicht im "Pressed"-State belassen, bzw. ein entsprechendes Verhalten verwenden? Die nativen Windows-Buttons können es jedenfalls.

Dass so ziemlich jedes GUI-Toolkit seine Widgets/Controls (gutes Beispiel...) anders benennt, ist auch ein leidiges Thema.

Was hast du an einem Pik Hand, offen und Schneider auszusetzen?
Offene Spiele sind nach internationaler Skatordnung immer auch Schwarz angesagt, bis auf den separat gezählten Null Ouvert.

HellHorse
2005-03-06, 01:35:04
Ok, jetzt mal ernstaft: AWT verwenden und sich dann darüber beschweren es sei nicht flexibel. Was kommt wohl als nächstes?

Vorschalg, verwende eine API für die sich Sun nicht schämt.

public class UnselectedRadioIcon implements Icon {

protected int width;

public UnselectedRadioIcon(int width) {
this.width = width;
}

public int getIconHeight() {
return this.width;
}

public int getIconWidth() {
return this.width;
}

public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
g.setColor(LIGHT_GRAY);
g.drawOval(x, y, this.width, this.width);
}
}

public class UnselectedRadioIcon implements Icon {

protected int width;

public UnselectedRadioIcon(int width) {
this.width = width;
}

public int getIconHeight() {
return this.width;
}

public int getIconWidth() {
return this.width;
}

public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
g.setColor(LIGHT_GRAY);
g.drawOval(x, y, this.width, this.width);
}
}

public class UnselectedCheckBoxIcon implements Icon {

protected int width;

public UnselectedCheckBoxIcon(int width) {
this.width = width;
}

public int getIconHeight() {
return this.width;
}

public int getIconWidth() {
return this.width;
}

public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
g.setColor(LIGHT_GRAY);
g.drawRect(x, y, this.width - 1, this.width - 1);
}
}

public class SelectedCheckBoxIcon extends UnselectedCheckBoxIcon {

private Shape sign;

public SelectedCheckBoxIcon(int width) {
super(width);
GeneralPath path = new GeneralPath();
int borderWidth = 4;
int signWidth = 4;
path.moveTo(borderWidth, this.width / 2 - signWidth / 2);
path.lineTo(this.width / 3f, this.width - borderWidth - signWidth);
path.lineTo(this.width - borderWidth, borderWidth);
path.lineTo(this.width - borderWidth, borderWidth + signWidth);
path.lineTo(this.width / 3f, this.width - borderWidth);
path.lineTo(borderWidth, this.width / 2 + signWidth / 2);
path.closePath();
this.sign = path;
}

public void paintIcon(Component c, Graphics g, int x, int y) {
super.paintIcon(c, g, x, y);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(DARK_GRAY);
AffineTransform oldTransform = g2d.getTransform();
AffineTransform newTranfrom = (AffineTransform) oldTransform.clone();
newTranfrom.preConcatenate(AffineTransform.getTranslateInstance(x, y));
g2d.setTransform(newTranfrom);
g2d.fill(this.sign);
g2d.setTransform(oldTransform);
}
}

public class CheckBoxDemo {

public static JFrame createFrame() {
JFrame frame = new JFrame("It can be done");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

JComponent contentPane = (JComponent) frame.getContentPane();
BoxLayout layout = new BoxLayout(contentPane, BoxLayout.PAGE_AXIS);
contentPane.setLayout(layout);
contentPane.setBorder(BorderFactory.createEmptyBorder(12, 12, 11, 11));

createRadioButtons(contentPane);
createCheckBoxes(contentPane);

frame.pack();
return frame;
}

private static void createRadioButtons(Container container) {
ButtonGroup bg = new ButtonGroup();
AbstractButton swingButton = makeBigRadioButton("Swing", 32);
swingButton.setSelected(true);
AbstractButton awtButton = makeNormalRadioButton("AWT");
awtButton.setSelected(true);
bg.add(swingButton);
bg.add(awtButton);
container.add(swingButton);
container.add(awtButton);
}

private static void createCheckBoxes(Container container) {
AbstractButton swingBox = makeBigCheckBox("Swing is cool", 32);
swingBox.setSelected(true);

AbstractButton awtBox = new JCheckBox("AWT is flexible");
container.add(swingBox);
container.add(awtBox);
}

private static AbstractButton makeBigCheckBox(String title, int iconSize) {
JCheckBox checkBox = new JCheckBox(title, new UnselectedCheckBoxIcon(iconSize));
checkBox.setSelectedIcon(new SelectedCheckBoxIcon(iconSize));
return checkBox;
}

private static AbstractButton makeBigRadioButton(String title, int iconSize) {
JRadioButton radioButton = new JRadioButton(title, new UnselectedRadioIcon(iconSize));
radioButton.setSelectedIcon(new SelectedRadioIcon(iconSize));
return radioButton;
}

private static AbstractButton makeNormalRadioButton(String title) {
JRadioButton radioButton = new JRadioButton(title);
return radioButton;
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = createFrame();
frame.setVisible(true);
}
});
}

}

Und schon hast du die CheckBoxes und RadioButtons so gross wie du willst.
http://img83.exs.cx/img83/4408/checkswing9qq.png
Thanks to ImageShack for Free Image Hosting (http://www.imageshack.us)

Pinoccio
2005-03-06, 02:46:36
Hm, zumindest der Button in der Combo-Box ist etwas breiter. Hast du nach dem Umstellen der dpi-Einstellung neu gestartet? Das könnte noch einen Unterschied machen.Das mit dem Button habe ich gar nicht gesehen ... :sneak:
Neu gestartet habe ich, so wie Windows wollte.Offene Spiele sind nach internationaler Skatordnung immer auch Schwarz angesagt, bis auf den separat gezählten Null Ouvert.Wohl wahr. Wenn man so lange nicht streng nach Skatordnung spielt, vergisst man eine ganze Menge!Ok, jetzt mal ernstaft: AWT verwenden und sich dann darüber beschweren es sei nicht flexibel.AWT hat für mich einen großen Vorteil: ich kann es. Und da JAVA weder meine täglich Brot ist noch mein größtes Hobby ist, ist es für mich einfacher, mit den Unzulänglichkeiten des AWT zu leben als umzulernen. So schlimm finde ich es auch nicht, entscheidnd ist für mich, daß ich mein Problem lösen kann, und hier heißt das eben: umfärben und nicht umlernen.
Viel wichtiger und auch schwieriger war die eigentliche Funktionalität, da die aber fertig ist geht es nun ans Layout bzw daran es zu verschönern und zu verbessern.
Außerdem hab ich mich eigentlich nur beschwert, daß zwar in den Api-docs Checkbox.setSize(int i1,int i2) drinne steht, aber keiner einem verrät, daß es nicht geht, warum das nicht geht und was man statt dessen tun soll.
Für deinen Code danke ich dir, es scheint aber, als wenn ich erstmal noch einiges ändern muss, damit ich ihn kompilieren kann. Wo kommt er her?

mfg Sebastian

HellHorse
2005-03-06, 11:27:26
AWT hat für mich einen großen Vorteil: ich kann es. Und da JAVA weder meine täglich Brot ist noch mein größtes Hobby ist, ist es für mich einfacher, mit den Unzulänglichkeiten des AWT zu leben als umzulernen.
Och mein Gott. Du fügst ein J vor die Namen der Komponentenklassen und du hast Swing (mehr oder weniger).

Außerdem hab ich mich eigentlich nur beschwert, daß zwar in den Api-docs Checkbox.setSize(int i1,int i2) drinne steht, aber keiner einem verrät, daß es nicht geht, warum das nicht geht und was man statt dessen tun soll.
Weil das nicht deine Aufgabe, sondern die des LayoutManagers ist (eigentlich setBounds). Du kannst nach setSize ein validate() auf den Container probieren, ob's was bringt ist fraglich. Je nach LayoutManager kann setPreferredSize helfen, bis sich was ändert und der Komponent preferredSize neu berechnet.
Der wichtige Punkt ist aber der: Du kannst dein Widget noch so gross oder klein machen, wie du willst, die Grösse der CheckBox oder des RadioButtons (bloss der Teil, auf den du klickst, also der Kreis oder das Quadrat in diesem Fall) ändert sich dadurch genausowenig wie die Grösse des Fonts.

Für deinen Code danke ich dir, es scheint aber, als wenn ich erstmal noch einiges ändern muss, damit ich ihn kompilieren kann.
Die imports fehlen, und natürlich muss jede Klasse in ein entsprechendes File.

Wo kommt er her?
Schnell hingepfuscht.

Pinoccio
2005-03-08, 17:51:02
Der wichtige Punkt ist aber der: Du kannst dein Widget noch so gross oder klein machen, wie du willst, die Grösse der CheckBox oder des RadioButtons (bloss der Teil, auf den du klickst, also der Kreis oder das Quadrat in diesem Fall) ändert sich dadurch genausowenig wie die Grösse des Fonts.Netter Weise kann ich die Größe des Textes ja ändern. Naja, egal.
Meine Version sieht so aus:
http://img206.exs.cx/img206/9366/skatbunt4ox.th.gif (http://img206.exs.cx/img206/9366/skatbunt4ox.gif)

Die Aktiven sind farblich markiert, bei einem Klick auf irgendeine andere wird umgefärbt.

mfg Sebastian