Java Fenster Hintergrundfarbe ändern?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet
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));

finnian657 
Beitragsersteller
 03.07.2021, 19:01

Vielen Dank, das hat funktioniert!

0

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

   }

}


regex9  03.07.2021, 20:19

Da ich das gerade sehe, einmal ein paar Anmerkungen.

1) Die Vererbung:

public class Main extends JFrame {

kannst du dir ersparen. Du nutzt sie ja eh nicht.

2) Vergiss diese Praxis

frame.setLayout(null);
// ...
button.setBounds(100, 75, 200, 150);

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:

frame.requestFocus();
frame.setResizable(true);

brauchst du nicht. Ein Fenster lässt sich bspw. initial immer vom Nutzer in seiner Größe verändern.

4) Dieser Aufruf:

frame.setVisible(true);

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.

static JButton button;

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.

SwingUtilities.invokeLater(() -> {
  /* ... */
});
1
pcdenker  03.07.2021, 20:24
@regex9

Vielen Dank, habe nur versucht, sein Projekt zum laufen zubringen, ohne große Veränderung, natürlich hast Du recht.

0
frame.setBackground(new Color(0xFF0000));
Woher ich das weiß:eigene Erfahrung

finnian657 
Beitragsersteller
 03.07.2021, 11:11
Du meinst statt  frame.setBackground(new Color (30, 34, 71)); ?
 Das funktioniert nämlich genauso nicht.
0
finnian657 
Beitragsersteller
 03.07.2021, 11:13
@Backstein42

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?

0
Backstein42  03.07.2021, 11:29
@finnian657

Nein, ich habs auch mal ohne Butten ausprobiert.

Tut mir leid ich kann dir bei dieser Frage nicht weiterhelfen.

0