Java Fenster Hintergrundfarbe ändern?
Hallo und guten Tag,
ich möchte die Hintergrundfarbe von einem Javafenster ändern. Doch wenn ich es wie unten gezeigt mache, dann blinkt die Farbe beim Starten nur einmal kurz auf.
Das hier ist der ganze Code:
public class Main extends JFrame{
static JButton button;
public Main() {
JFrame frame = new JFrame("Clicker");
frame.setSize(500, 400);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setResizable(true);
frame.setLocationRelativeTo(null);
frame.setLayout(null);
frame.requestFocus();
frame.setBackground(new Color (30, 34, 71));
button = new JButton("Click Here!");
button.setBounds(100, 75, 200, 150);
button.setFocusPainted(false);
button.setBorder(BorderFactory.createRaisedBevelBorder());
button.addActionListener(new ActionHandler());
button.setBackground(new Color (30, 34, 71));
frame.add(button);
frame.setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
3 Antworten
dann blinkt die Farbe beim Starten nur einmal kurz auf
Weil es von der ContentPane übermalt wird - ein JFrame besteht ja aus mehreren Widgets. Du musst also in dieser die Farbe ändern, etwa so:
frame.getContentPane().setBackground(new Color(30, 34, 71));
import java.awt.*;
import javax.swing.*;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Main extends JFrame {
private static final long serialVersionUID = 1L;
static JButton button;
public Main() {
JFrame frame = new JFrame("Clicker");
frame.setSize(500, 400);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setResizable(true);
frame.setLocationRelativeTo(null);
frame.setLayout(null);
frame.requestFocus();
frame.getContentPane().setBackground(new Color(30, 34, 71));
frame.setVisible(true);
button = new JButton("Click Here!");
button.setBounds(100, 75, 200, 150);
button.setFocusPainted(false);
button.setBorder(BorderFactory.createRaisedBevelBorder());
button.addActionListener(new ActionHandler());
button.setBackground(new Color (30, 34, 71));
frame.add(button);
}
public static void main(String[] args) {
new Main();
}
}
So habe ich es gelöst - dazu auch eine class erstellt :
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ActionHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
frame.setBackground(new Color(0xFF0000));
Du meinst statt frame.setBackground(new Color (30, 34, 71)); ?
Das funktioniert nämlich genauso nicht.
Man kann es entweder im Hexadezimalsystem darstellen mit RGB.
Das ist ja nicht das Problem, das Problem ist, dass die Farbe sich nur am Anfang kurz verändert, dann aber wieder weiß wird. Liegt es vielleicht an dem Button?
Nein, ich habs auch mal ohne Butten ausprobiert.
Tut mir leid ich kann dir bei dieser Frage nicht weiterhelfen.
Da ich das gerade sehe, einmal ein paar Anmerkungen.
1) Die Vererbung:
kannst du dir ersparen. Du nutzt sie ja eh nicht.
2) Vergiss diese Praxis
am besten schnell wieder. Swing nutzt aus gutem Grund für die Positionierung seiner Komponenten bzw. der Aufteilung der grafischen Oberfläche Layout Manager, die man auch nutzen sollte. Sie erst ermöglichen die Gestaltung eines flexiblen Layouts.
Wenn dir die Layout Manager zu kompliziert sein sollten, verwende einen Swing Builder oder schau dir vielleicht das MigLayout (externe Bibliothek) an. Noch eine andere Alternative wäre es, ein anderes Toolkit (wie JavaFX) zu nutzen.
Solltest du die Idee, das Layout auf null zu setzen, aus einem Tutorial haben, würde ich ausdrücklich dazu raten, diesem nicht weiter zu folgen.
Als die bisher zuverlässigste Quelle zu Java Swing haben sich die Oracle Tutorials erwiesen.
3) Diese Aufrufe:
brauchst du nicht. Ein Fenster lässt sich bspw. initial immer vom Nutzer in seiner Größe verändern.
4) Dieser Aufruf:
gehört an das Ende deiner Methode. Das Fenster sollte stets erst dann gezeichnet werden, sobald es für den Betrachter fertig ist. Momentan wären bei dir mehrere Zeichenvorgänge für das Fenster notwendig (nach jeder Änderung der Oberfläche ein neuer), was prinzipiell ein teurer Prozess ist.
5) Es besteht kein Grund, den Button statisch zu deklarieren.
Daher würde ich das auch nicht tun. Nutze static nur, wenn es sich tatsächlich um eine Eigenschaft handelt, die nicht objektgebunden ist. Der Button gehört aber zum Fenster deiner Anwendung.
6) Vorbeugend, da du einen Listener einsetzen möchtest, würde ich dir empfehlen, dich zum Event Dispatch Thread zu belesen. Der GUI-Code wäre folgendermaßen in einem Callback für invokeLater gut aufgehoben.