JButtons haben nicht immer lust zu erscheinen

Status
Nicht offen für weitere Antworten.
Hallo,
ich schreibe grade mein erstes programm mit swing und awt und habe ein problem mit JButtons.
Da ich keine Ahnung habe an welcher Stelle das Problem liegt, hoffe ich dass es ok ist wenn ich einfach mal den ganzen code poste:


Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class DrawPanel extends JPanel{

        private JButton book;
        private JButton stats;
        protected JButton admin;



@Override
public void paintComponent(Graphics g){


    super.paintComponent(g);


    int width = getWidth();
    int height = getHeight();

    g.setColor(Color.BLACK);
    g.fillRect(0, 36, width, 3);

    book = new JButton ("Booking");
    book.setVisible(true);
    add (book);
    stats = new JButton("Statistics");
    stats.setVisible(true);
    add(stats);
    admin = new JButton("Admin");
    admin.setVisible(true);
    add(admin);


    setVisible(true);

}
}


das ganze rufe ich dann von der main-klasse aus so auf:


Code:
DrawPanel x = new DrawPanel();

JFrame application = new JFrame("Flight Reservation System");

application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
application.add(x);
application.setSize(650,500);
application.setVisible(true);


so weit so gut, ab und zu funktioniert das ganze auch. allerdings nicht immer. die JButtons tauchen komischerweise nur bei ungefähr jedem zweiten aufruf des programms auf. Ich arbeite mit Netbeans und nach dem drücken des "Run Main Project"-Knopfes ist es reine glücksache, ob die buttons erscheinen oder nicht. Und das obwohl ich am code nichts ändere. Wenn die buttons nicht erschienen sind und ich die größe des Applet-Fensters ändere tauchen sie auf (allerdings gleich in mehrfacher ausführung).

Kann mir irgendjemand erklären woran das liegt und wie ich das beheben kann?

vielen dank schonmal!


Hier noch Systeminfos:
Product Version: NetBeans IDE 6.5 (Build 200811100001)
Java: 1.6.0_07; Java HotSpot(TM) Client VM 10.0-b23
System: Windows Vista version 6.0 running on x86; Cp1252; de_DE (nb)
 
S

SlaterB

Gast
nicht setVisible(true) pro JButton aufrufen, der eine Aufruf an application am Ende reicht

edit:
in paintComponent() haben derartige add()-Aufrufe noch weniger zu suchen,
das gehört in den Konstruktor von DrawPanel!

individuelles Zeichnen zusammen mit enthaltenen Standardkomponenten kann zu Problemen führen,
wenn du schon irgendwo malst, dann in einem exklusiven Bereich für ein paint-JPanel ohne Buttons usw.
 
Zuletzt bearbeitet von einem Moderator:

dvid85

Aktives Mitglied
ja genau, in den paint-methoden sollten wirklich nur paint-sachen drin sein. diese methode wird eben immer aufgerufen, wenn neu gezeichnet werden muss. das kann unter umständen mehrere 100 mal pro sekunde sein.
d.h. du würdest den button auch jedes man neu definieren und auf die komponente adden.

ich weiß ja nicht genau, was dein zweck ist, aber am besten wäre es sicherlich, das draw-panel nur mit dem drawRect() zu gestalten und in dem main-programm die button auf das draw panel adden.

also z.b. so

[HIGHLIGHT="Java"]
application.add(x);
book = new JButton ("Booking");
x.add (book);
[/HIGHLIGHT]

ein book.setVisible(true) braucht man nicht. das geschieht automatisch
 
ok danke euch beiden, jetz klappts =)

noch ne andere frage (sorry schon wieder ne blöde frage, aber ich bin echt anfänger auf dem gebiet):

also diese 3 buttons sollen als menü fungieren und je nachdem welcher button angeklickt wurde soll was anderes von der paint methode gezeichnet werden. könntet ihr mir so grob erklären nach welchem prinzip ich das machen könnte?
meine eine erste idee wäre gewesen, dass beim buttonklick einfach eine variable geändert wird und ich in der paintComponent Methode nach if-abfrage dieser variable jeweils andere sachen zeichnen lasse. dann müsste ich aber in der main-methode ne endlosschleife mit "repaint()" machen und dass is ein bisschen zu unperformant ^^
 

dvid85

Aktives Mitglied
da es dein ersten programm ist gebe ich dir gleich mal nen tipp, wie du bestimmen kannst, was passieren soll, wenn du auf einen button klickst.

[HIGHLIGHT="Java"]
book.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
// hier die akion reinschreiben
}
});
[/HIGHLIGHT]

sieht für für anfänger sicher kryptisch aus. was dort passier ist folgendes:
man führt dem button einen Listener hinzu. Dieser "lauscht" so zu sagen auf bestimmte Aktionen. Beim Button ist das eben z.b. ein mausklick. wenn geklickt wurde wird ein ActionEvent geworfen und kommt in der methode actionPerformed an. diese methode wird also aufgerufen wenn geklickt wurde. alles was du da reinschreibst wird dann ausgeführt.

hoffe, ich hab dir was neues erzählt :)
 
G

Gast2

Gast
Hier hab ich mal was für dich.
Spiel ein bischen damit rum wenn was unklar ist dann frag nach...
In deer FAQ gibts es auch ein gutes Tutorial wie man am besten zeichnet

[HIGHLIGHT="Java"]

public class MainDrawPanel extends JPanel{

DrawPanel drawPanel;
MenuePanel menuePanel;

public MainDrawPanel()
{
super(new BorderLayout());
drawPanel = new DrawPanel();
drawPanel.setBorder(BorderFactory.createTitledBorder("Draw"));
menuePanel = new MenuePanel();

add(drawPanel, BorderLayout.CENTER);
add(menuePanel, BorderLayout.NORTH);

}

class DrawPanel extends JPanel
{
Shape shape;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
if(shape != null)g2.draw(shape);
}

public void drawOperation(Shape shape)
{
this.shape = shape;
repaint();
}
}



class MenuePanel extends JPanel
{
public MenuePanel()
{
JButton linie = new JButton("Linie");
linie.addActionListener(new ActionListener()
{

public void actionPerformed(ActionEvent e) {
drawPanel.drawOperation(new Line2D.Double(10.0,10.0,100.0,30.3));

}

});
JButton kreis = new JButton("Kreis");
kreis.addActionListener(new ActionListener()
{

public void actionPerformed(ActionEvent e) {
drawPanel.drawOperation(new Ellipse2D.Double(10,10,50,50));

}

});
JButton rechteck = new JButton("Rechteck");
rechteck.addActionListener(new ActionListener()
{

public void actionPerformed(ActionEvent e) {
drawPanel.drawOperation(new Rectangle(100,10,40,50));

}

});
add(linie);
add(kreis);
add(rechteck);
}
}

public static void main(String[] args) {
JFrame frame = new JFrame("Draw");
frame.add(new MainDrawPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}


[/HIGHLIGHT]
 
Zuletzt bearbeitet von einem Moderator:

dvid85

Aktives Mitglied
oh, da war ja schon jemand schneller als ich.
ich hab dir auch mal was geschrieben.

DrawPanel ist hier eine innere klasse. die kannst du auch einfach als eigene klasse schreiben, denn muss man sie nicht so komisch deklarieren.

wie du siehst, habe ich einige variablen als static final... usw mit passenden namen definiert. das ist ein guter stil um von außen die variable festzulegen, die bestimmt was gezeichnet werden soll.


[HIGHLIGHT="Java"]
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MenuButton extends JFrame{

public MenuButton(String title){
super(title);
setSize(350, 150);
// EDIT
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
MenuButton mb = new MenuButton("Test");

JPanel panel = new JPanel();
final DrawPanel drawPanel = mb.new DrawPanel(350,100);
JButton dr = new JButton("Draw Rect");
JButton fr = new JButton("Fill Rect");
JButton dc = new JButton("Draw Circle");

mb.add(panel);
panel.add(dr);
panel.add(fr);
panel.add(dc);
panel.add(drawPanel);

dr.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
drawPanel.setDrawItem(DrawPanel.DRAW_RECT);
drawPanel.repaint();
}
});

fr.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
drawPanel.setDrawItem(DrawPanel.FILL_RECT);
drawPanel.repaint();
}
});

dc.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
drawPanel.setDrawItem(DrawPanel.DRAW_CIRCLE);
drawPanel.repaint();
}
});


mb.setVisible(true);
}


class DrawPanel extends JPanel{

public DrawPanel(int width, int height){
super();
setSize(width, height);
setPreferredSize(new Dimension(width,height));
setOpaque(false); // das braucht man hier, damit die grafik wieder ganz neu gezeichnet wird
}

public final static int DRAW_RECT = 0;
public final static int FILL_RECT = 1;
public final static int DRAW_CIRCLE = 2;
private int drawItem;

public void setDrawItem(int item){
drawItem = item;
}

public void paintComponent(Graphics g){
switch (drawItem) {
case DRAW_RECT:
g.drawRect(0, 0, 60, 60);
break;
case FILL_RECT:
g.fillRect(0, 0, 60, 60);
break;
case DRAW_CIRCLE:
g.drawOval(0, 0, 60, 60);
break;
}
}
}
}[/HIGHLIGHT]
 
Zuletzt bearbeitet:
G

Gast2

Gast
Du musst bedenken wenn du dein altes schon mal gezeichnetes beibehalten willst... Musst du es "speichern" z.B. in einer ArrayList ...

@divd85
Naja mit deinen ganzen finals wird es schnell unübersichtlich wenn du jetzt viele Shapes hast...
und der switch/if ist ja nicht notwendig...

EDIT: ich weiß nicht was du vorhast und wieviel shapes du anbieten willst aber ich würde anstatt ein panel wo die buttons drin sind... eventuell eine toolbar oder sowas dafür machen...
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M ich will die alten "alte JButtons"wieder haben AWT, Swing, JavaFX & SWT 6
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
schoel27 Mehrere JButtons sollen das gleiche Event auslösen AWT, Swing, JavaFX & SWT 2
H Auswahlmenü mit JButtons AWT, Swing, JavaFX & SWT 4
H JButtons werden nicht angezeigt AWT, Swing, JavaFX & SWT 5
A Swing Meine JButtons werden nicht angezeigt bitte helft mir AWT, Swing, JavaFX & SWT 2
N "Automatisches" erstellen von jButtons AWT, Swing, JavaFX & SWT 1
F JButtons neu laden AWT, Swing, JavaFX & SWT 4
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
S JButtons an Koordinaten setzen AWT, Swing, JavaFX & SWT 3
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
Java_RY wie kann ich auf JButtons in einem JPanel zugreifen AWT, Swing, JavaFX & SWT 3
M Swing Selbstanordnende JButtons AWT, Swing, JavaFX & SWT 4
J EventHandler Bei JButtons AWT, Swing, JavaFX & SWT 2
L Swing Variable Anzahl an JButtons AWT, Swing, JavaFX & SWT 7
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
A JTextField und JButtons AWT, Swing, JavaFX & SWT 2
F JButtons erstellen lassen mit unterschiedlichen Funktionen AWT, Swing, JavaFX & SWT 3
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
Kenan89 LayoutManager JPanel wächst beim adden neuer JButtons nicht mit AWT, Swing, JavaFX & SWT 4
A JButtons - es wird beim falschen Button die Hintergrundfarbe angepasst AWT, Swing, JavaFX & SWT 2
Z kleine JButtons und ihre Beschriftung AWT, Swing, JavaFX & SWT 5
K Swing Abgerundete JButtons AWT, Swing, JavaFX & SWT 8
Tsuna JButtons in Apple-Design AWT, Swing, JavaFX & SWT 4
J JButtons in aktivieren und deaktivieren AWT, Swing, JavaFX & SWT 3
T JButtons indexiert unter NetBeans anlegen AWT, Swing, JavaFX & SWT 7
H JButtons in JTable anzeigen AWT, Swing, JavaFX & SWT 5
T Maximale Länge eines JButtons AWT, Swing, JavaFX & SWT 5
K JButtons innerhalb eines JPanels verschieben (DRAG&DROP) AWT, Swing, JavaFX & SWT 5
R Swing Verschieben eines jButtons mittels MouseDragged AWT, Swing, JavaFX & SWT 4
K Runde JButtons ? AWT, Swing, JavaFX & SWT 7
B Swing JButtons in eine Arraylist<JButton> einfügen AWT, Swing, JavaFX & SWT 2
G Swing JButtons + ActionListener + final AWT, Swing, JavaFX & SWT 3
U Problem mit JButtons AWT, Swing, JavaFX & SWT 6
C Interface für JButtons,... AWT, Swing, JavaFX & SWT 7
J Swing JButtons und die ActionEvents AWT, Swing, JavaFX & SWT 2
U Grafikkontext unter JButtons? AWT, Swing, JavaFX & SWT 5
Strahlungsleck Funktionalität von JButtons (Actionlistener etc.) AWT, Swing, JavaFX & SWT 17
G Sehr kleine JButtons mit Icon oder Beschriftung AWT, Swing, JavaFX & SWT 2
F Sender für jButtons? AWT, Swing, JavaFX & SWT 2
J JButtons in Tabellenspalten anzeigen AWT, Swing, JavaFX & SWT 2
J JScrollBar scroll-Verhalten auf 2 JButtons umleiten? AWT, Swing, JavaFX & SWT 2
N Minesweeper: 2D Feld von JButtons anlegen AWT, Swing, JavaFX & SWT 19
F Wie Oberfläche verbessern? (JButtons, Textfeld verkleinern) AWT, Swing, JavaFX & SWT 5
U Bilder, JLabels, JButtons voreinander AWT, Swing, JavaFX & SWT 7
D Darstellungsprobleme bei JButtons auf JInternalFrames AWT, Swing, JavaFX & SWT 4
A Hintergrundfrabe eines JButtons innerhalb eines JToolBar AWT, Swing, JavaFX & SWT 4
T Ausrichtung eines Jbuttons AWT, Swing, JavaFX & SWT 6
S JButtons Größe AWT, Swing, JavaFX & SWT 15
M JButtons immer gleiche Größe? AWT, Swing, JavaFX & SWT 8
H Unsichtbare JButtons? AWT, Swing, JavaFX & SWT 5
C JComboBox mit JButtons befüllen AWT, Swing, JavaFX & SWT 8
1 Warum sind JButtons viel breiter als der enthaltene Text ? AWT, Swing, JavaFX & SWT 4
S Text eines JButtons vertikal schreiben AWT, Swing, JavaFX & SWT 5
L-ectron-X Den Text eines JButtons unter das Icon setzen? AWT, Swing, JavaFX & SWT 2
M JButtons in JScrollPanel darstellen AWT, Swing, JavaFX & SWT 6
S JButtons in einem JPanel erscheinen nicht direkt AWT, Swing, JavaFX & SWT 7
G von JButtons erben, aber richtig! AWT, Swing, JavaFX & SWT 4
R JButtons werden nicht dargestellt AWT, Swing, JavaFX & SWT 7
G JButtons AWT, Swing, JavaFX & SWT 7
Z Problem mit Spielfläche aus JButtons AWT, Swing, JavaFX & SWT 2
H große mengen an jbuttons dynamisch erzeugen? AWT, Swing, JavaFX & SWT 15
G Icon eines JButtons ändern? AWT, Swing, JavaFX & SWT 7
M JButtons mit Linie verbinden AWT, Swing, JavaFX & SWT 4
S Bei BoxLayout haben hinzugefügten Jpanels einen Versatz/Space AWT, Swing, JavaFX & SWT 0
GianaSisters Swing jTable - Feldtext soll mehrere Zeilen haben AWT, Swing, JavaFX & SWT 3
N Button soll die Größ eines Icons haben AWT, Swing, JavaFX & SWT 5
I Panel scheint keine Größe zu haben AWT, Swing, JavaFX & SWT 3
S Table oder TableModel so ueberschreiben, dass Columns minimale Breite haben? AWT, Swing, JavaFX & SWT 2
O jList + mitteilen das Daten sich geändert haben? AWT, Swing, JavaFX & SWT 9
O haben panels von anfang an einen dummen rand? AWT, Swing, JavaFX & SWT 19
V JTable Spaltenköpfe haben andere Namen wie in der DB AWT, Swing, JavaFX & SWT 2
N in Frame Grafiken zeichnen und gleichz. Buttons haben? AWT, Swing, JavaFX & SWT 2
K mein keyListener scheint Konflict haben mit mouseListener AWT, Swing, JavaFX & SWT 6
D Merken, daß Daten in der JTable sich geändert haben... AWT, Swing, JavaFX & SWT 2
F JavaFX Per Jpacke erstellte exe startet nicht AWT, Swing, JavaFX & SWT 5
Juelin Text und Backgroundcolor im Label geht nicht AWT, Swing, JavaFX & SWT 7
richis-fragen Spaltenbreite bei drag nicht änderbar AWT, Swing, JavaFX & SWT 4
Juelin if Abfrage funktioniert nicht richtig AWT, Swing, JavaFX & SWT 10
MiMa Darstellung von FXML ateien nicht korrekt (SceneBuilder) AWT, Swing, JavaFX & SWT 2
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX PixelWriter.setColor setzt Farbe nicht AWT, Swing, JavaFX & SWT 2
M JavaFX Diagonale Linie nicht ausgegeben/angezeigt AWT, Swing, JavaFX & SWT 1
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
Hatsi09 Javafx MediaPlayer spielt nicht immer AWT, Swing, JavaFX & SWT 3
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
P AWT Programm funktioniert nicht richtig AWT, Swing, JavaFX & SWT 35
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
thor_norsk Icons laden nicht in GUI AWT, Swing, JavaFX & SWT 15
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
G JOptionPane zeigt nicht an was ich will AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben