Eigene Border für Buttons

Status
Nicht offen für weitere Antworten.

Andreas1989

Aktives Mitglied
Hallo ich bins mal wieder...
Ich möchte für meine jButtons eigene standard Borders und eigene RolloverBorders zeichnen. Die Methode, welche du standard Border zeichnet heit paintBorder und ist eine statische Methode von jComponent. Wenn ich nun andere standard Border und andere RolloverBorder haben möchte, muss ich dann die Klasse jComponent vererben und die benötigten Methoden überschreiben, oder bin ich da an der falschen stelle?

Gruß
Andreas
 

Andreas1989

Aktives Mitglied
Hallo Schandro,
nee die Methode kenn ich.
Standardmässig soll mein Button keine Border haben, sobald ich über den Border drüber fahre soll die rechte und die untere Border Schwarz werden, die linke und die obere weis. Wenn ich draufklicke genau anderst rum. Dadruch soll der Button blasitscher werden. Von Haus aus gibt es leider keine Methode mit der ich das machen kann - soweit mir bekannt. Deswegen sollte ich wissen, welche Methoden dafür verantwortlich sind - wenns jemand weis.

Danke.
 

Schandro

Top Contributor
naja, entweder du realisierst es einfach in paintComponent
oder du machst ein Implementierung vom Interface Border wo du dynamisch entscheidest wie genau der Border sich malen soll. (Border müssen ja nicht unbedingt "statisch" aussehen)
 

Verjigorm

Top Contributor
Ein Rahmen ist eine Klasse, die die Schnittstelle Border implementiert. Swing stellt einige Standardrahmen zur Verfügung.

Du schreibst dir eine Klasse, die Border implementiert.

Du musst u.a. die Funktion paintBorder vom Interface implementieren, in der du dann deinen Rahmen zeichnen kannst.
Dein Button weiss ja auch, wann die Maus drüber ist etc. kannste alles abfragen.

Code:
    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width,
            int height) {
        // TODO Auto-generated method stub

    }
 
Zuletzt bearbeitet:

Andreas1989

Aktives Mitglied
Hallo,
soweit hab ich das jetzt gemacht. Hab aber noch mit einem Schwirgkeiten.
Code:
public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
//....
}
Wenn ich nun diese Methode in meinem Hauptprogramm aufrufe um die Ränder zu Zeichnen weis ich erlich gesagt nicht was für eine Graphics ich übergeben muss. Wenn ich im Programm selbst eine tempGraphics anlege
Code:
Graphics tempGraphics = null)
und die dann übergebe bekomme ich eine NullPointerException.
Was mach ich falsch...
 

Andreas1989

Aktives Mitglied
Aso.. jo, jetzt tut es. Wie kann ich ermitteln auf welchem Button ich gerade bin? bzw. welchen ich gerade drücke. Ich will ja standardmässig kein Border nur wenn ich drüber fahre und ihn anklicke..
Danke!
 

Ebenius

Top Contributor
Hier ein einfaches Beispiel: [Highlight=Java]final Border simpleRolloverButtonBorder = new Border() {

public void paintBorder(
Component c,
Graphics g,
int x,
int y,
int width,
int height) {
final AbstractButton button = (JButton) c;
final ButtonModel model = button.getModel();
if (model.isRollover()) {
g.setColor(model.isArmed() ? Color.BLACK : Color.WHITE);
g.drawLine(x, y, x + width - 1, y);
g.drawLine(x, y, x, y + height - 1);
g.setColor(model.isArmed() ? Color.WHITE : Color.BLACK);
g.drawLine(x, y + height - 1, x + width - 1, y + height - 1);
g.drawLine(x + width - 1, y, x + width - 1, y + height - 1);
}
}

public boolean isBorderOpaque() {
return false;
}

public Insets getBorderInsets(Component c) {
return new Insets(1, 1, 1, 1);
}
};[/Highlight]
Ebenius
 

Andreas1989

Aktives Mitglied
hallo,
wo ist der Fehler?
Exception in thread "main" java.lang.InstantiationError: test.JMyButton
at layout.<init>(layout.java:33)
at layout.main(layout.java:216)
Haupt Programm
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import test.*;
public class layout extends JFrame {
//..
private JMyButton jBRefresh = new JMyButton();
//..
jBRefresh.setBounds(x, y, w, h);
jBRefresh.setText(tempString);
jBRefresh.setFocusPainted(false);
jBRefresh.setBackground(cDefault);
jBRefresh.setBorderPainted(true);
jBRefresh.setIcon(iArtikel);
//..
klasse JMyButton
Code:
public abstract class JMyButton extends JButton implements Border
{  
  final Border simpleRolloverButtonBorder = new Border() 
  {
    @Override
    public void paintBorder(
        Component c,
        Graphics g,
        int x,
        int y,
        int width,
        int height) 
    {
      final AbstractButton button = (JButton) c;
      final ButtonModel model = button.getModel();
      if (model.isRollover()) 
      {
        g.setColor(model.isArmed() ? Color.BLACK : Color.WHITE);
        g.drawLine(x, y, x + width - 1, y);
        g.drawLine(x, y, x, y + height - 1);
        g.setColor(model.isArmed() ? Color.WHITE : Color.BLACK);
        g.drawLine(x, y + height - 1, x + width - 1, y + height - 1);
        g.drawLine(x + width - 1, y, x + width - 1, y + height - 1);
      }
    }
    public boolean isBorderOpaque() 
    {
      return false;
    }

    public Insets getBorderInsets(Component c) 
    {
      return new Insets(1, 1, 1, 1);
    }
  };
}

Gruß Andreas
 

Andreas1989

Aktives Mitglied
Hallo,
Zeile 33 ist: private JMyButton jBRefresh = new JMyButton();
da wird auch zum ersten mal ein JMyButton angelegt.
Es muss also was mit der Klasse JMyButton net stimmen
 

hoveman

Mitglied
ich habe das gleiche problem.
@Ebenius: dein quellcode funktioniert wunderbar. nur wenn ich das look and feel änder, dann geht es leider nicht mehr. :(

Code:
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new GUI().setVisible(true);
            }
        });
    }

}
Code:
public class GUI extends javax.swing.JFrame {

    /** Creates new form GUI */
    public GUI() {
        initComponents();
        initButton();
    }

    private void initButton() {
        final Border simpleRolloverButtonBorder = new Border() {

            public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
                final AbstractButton button = (JButton) c;
                final ButtonModel model = button.getModel();
                System.out.println("paintBorder: ("+x+","+y+","+width+","+height+")"+" isRollover: "+model.isRollover());
                if (model.isRollover()) {
                  g.setColor(model.isArmed() ? Color.BLACK : Color.WHITE);
                  g.drawLine(x, y, x + width - 1, y);
                  g.drawLine(x, y, x, y + height - 1);
                  g.setColor(model.isArmed() ? Color.WHITE : Color.BLACK);
                  g.drawLine(x, y + height - 1, x + width - 1, y + height - 1);
                  g.drawLine(x + width - 1, y, x + width - 1, y + height - 1);
                }
            }

            public boolean isBorderOpaque() {
                return false;
            }

            public Insets getBorderInsets(Component c) {
                return new Insets(1, 1, 1, 1);
            }
        };
        jButton1.setBorder(simpleRolloverButtonBorder);
    }

    .......
}

mein os: win xp
 

hoveman

Mitglied
Hab kein XP zum testen. Funktioniert's, wenn Du dem Button setRolloverEnabled(true) sagst?

Ebenius

heissen dank... jetzt funktionierts. komisch nur, dass ich es bei dem windows look and feel auf true setzten muss, bei dem standart look and feel aber nicht???:L

edit: jetzt hätte ich nur noch eine frage: wie kann ich links und rechts, sowie oben und unten mehr abstand zum text machen? x sowie y sind ja schon 0 ???:L sonst hätte ich zu width und height was dazu addiert und bei x und y was abgezogen
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
heissen dank... jetzt funktionierts. komisch nur, dass ich es bei dem windows look and feel auf true setzten muss, bei dem standart look and feel aber nicht???:L
Dazu sagt die API-Doc:
The default value for the rolloverEnabled property is false. Some look and feels might not implement rollover effects; they will ignore this property.

jetzt hätte ich nur noch eine frage: wie kann ich links und rechts, sowie oben und unten mehr abstand zum text machen? x sowie y sind ja schon 0 ???:L sonst hätte ich zu width und height was dazu addiert und bei x und y was abgezogen
Du willst den Innenabstand vom Text zum Rahmen erhöhen? Das geht mit button.setMargin(new Insets(10, 10, 10, 10).

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
H MouseAdapter Klasse nutzen wenn eigene Klasse bereits von anderer erbt AWT, Swing, JavaFX & SWT 13
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
L JavaFX Eigene Font benutzen AWT, Swing, JavaFX & SWT 6
B Notepad++ in die eigene GUI einbinden AWT, Swing, JavaFX & SWT 7
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
M Eigene Klasse mit Grafikobjekten schreiben AWT, Swing, JavaFX & SWT 4
S JavaFX Drehen um eigene Achse AWT, Swing, JavaFX & SWT 2
P X extends TreeView - eigene Methoden AWT, Swing, JavaFX & SWT 5
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
L Eigene Component anordnen AWT, Swing, JavaFX & SWT 7
L JavaFX Eigene JavaFX Controls anlegen AWT, Swing, JavaFX & SWT 1
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
A JavaFX Scene Builder eigene Klasse hinzufügen AWT, Swing, JavaFX & SWT 2
L Swing Wie programmiere ich eine eigene GUI? AWT, Swing, JavaFX & SWT 12
T Swing Eigene Konsole AWT, Swing, JavaFX & SWT 5
D Swing Eigene Tabelle AWT, Swing, JavaFX & SWT 18
M eigene horizontale Scrollbar AWT, Swing, JavaFX & SWT 1
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
J JavaFX Eigene ListCell Problem(Objekte werden doppelt angezeigt) AWT, Swing, JavaFX & SWT 1
C Swing MenuBar als eigene Klasse AWT, Swing, JavaFX & SWT 4
A Swing Eigene JComponent Scrollable AWT, Swing, JavaFX & SWT 6
Kenan89 3D Models aus anderen Spielen in eigene einfügen AWT, Swing, JavaFX & SWT 3
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
P Eigene CMD GUI zum Starten von JAR AWT, Swing, JavaFX & SWT 10
M Swing eigene Dialoge, aber wie genau? AWT, Swing, JavaFX & SWT 5
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
K 3D-Grafik Eigene "Kamera" AWT, Swing, JavaFX & SWT 2
T eigene Klasse für Panel AWT, Swing, JavaFX & SWT 9
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
alderwaran Swing XML editor plugin für eigene anwendung AWT, Swing, JavaFX & SWT 2
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
B Eigene Methoden in TABs einfügen AWT, Swing, JavaFX & SWT 8
R eigene Methoden für Buttons? AWT, Swing, JavaFX & SWT 11
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
T Eigene JComponent AWT, Swing, JavaFX & SWT 4
L Eigene Design Oberfläche erstellen AWT, Swing, JavaFX & SWT 3
1 Eigene Component in JScrollBar + fixe Linien??? AWT, Swing, JavaFX & SWT 2
T SWT eigene Komponenten AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
A Eigene StatusBar AWT, Swing, JavaFX & SWT 2
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
D Eigene Methode soll Gerade zeichnen AWT, Swing, JavaFX & SWT 5
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
MrMilti eigene Klasse in JTable ablegen AWT, Swing, JavaFX & SWT 12
R Swing JTable: Eigene Zeichnung im Header AWT, Swing, JavaFX & SWT 11
A Eigene Buttons AWT, Swing, JavaFX & SWT 20
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
S Eigene GUI (evt. Toolkit) AWT, Swing, JavaFX & SWT 10
M SWT: eigene Events AWT, Swing, JavaFX & SWT 9
& eigene Schriftart in JEditorpane AWT, Swing, JavaFX & SWT 2
T Eigene Fenster kreieren?zb. wie bei Winamp? AWT, Swing, JavaFX & SWT 9
D Eigene Component erstellen? AWT, Swing, JavaFX & SWT 4
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
M Eigene Klasse für mehrer JSplitPanes AWT, Swing, JavaFX & SWT 3
M Eigene Komponenten basteln AWT, Swing, JavaFX & SWT 25
O Eigene GUI Objekte entwerfen? AWT, Swing, JavaFX & SWT 3
A Eigene, sich selbst zeichnende Component AWT, Swing, JavaFX & SWT 5
S Eigene Komponenten AWT, Swing, JavaFX & SWT 2
T Eigene erweiterte MouseEvents nutzen AWT, Swing, JavaFX & SWT 2
M In eigene JPanel Klasse zeichnen AWT, Swing, JavaFX & SWT 4
M CellEditor und CellRenderer für eigene Klasse AWT, Swing, JavaFX & SWT 4
M eigene ComponentUI und Serializable AWT, Swing, JavaFX & SWT 3
E Eigene Steuerelemente bauen AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
G fullscreen GUI - eigene components? AWT, Swing, JavaFX & SWT 2
T 4 db tabellen in einem karteireiter eigene klasse für die me AWT, Swing, JavaFX & SWT 7
S SWT Für jede gui komponente eigene methode AWT, Swing, JavaFX & SWT 2
J Eigene Fehlermeldung in AWT erzeugen AWT, Swing, JavaFX & SWT 2
D eigene SwingKonsole. AWT, Swing, JavaFX & SWT 5
I Eigene JComboBox AWT, Swing, JavaFX & SWT 10
C UIDefaults für eigene Klasse anpassen AWT, Swing, JavaFX & SWT 3
C ISelectionProvider und eigene Selections AWT, Swing, JavaFX & SWT 2
M kann man auch eigene look and feels machen? AWT, Swing, JavaFX & SWT 2
L eigene Komponente, ActionEvent senden? AWT, Swing, JavaFX & SWT 3
E Beim Schließen des Fensters eigene Funktion aufrufen AWT, Swing, JavaFX & SWT 8
M JTable mit JCombobox eigene Auswahl pro Zeile ? AWT, Swing, JavaFX & SWT 3
T JFrame - eigene Titelleiste AWT, Swing, JavaFX & SWT 8
Y Eigene Komponente einfügen AWT, Swing, JavaFX & SWT 6
G Eigene Koponente erstellen AWT, Swing, JavaFX & SWT 3
G Eigene Componente in jScrollView einbetten AWT, Swing, JavaFX & SWT 6
T Eigene grafische Oberfläche AWT, Swing, JavaFX & SWT 7
K JavaFX CSS Border (Verschiebung verhindern) AWT, Swing, JavaFX & SWT 4
MiMa GUI Controller für Border Pane als MVC Modell AWT, Swing, JavaFX & SWT 1
MaxG. JavaFX JavaFX Border zuweisen AWT, Swing, JavaFX & SWT 8
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben