system
1. November 2013 um 12:30
1
Hi!
Also ich habe das Problem, dass wenn ich ein JPanel habe und auf diesem ein JLabel adde oder jegliche andere Swing-Komponenten(wie Textfelder etc) und nun danach auf das Panel ein neues JPanel lege dann scheint die Schrift des
Labels durch das zweite Panel. Habe es schon mit setOpaque versucht geht leider nicht? Wie kann ich es also unterbinden das die Komponenten durchscheinen?!
Es soll so eine Art Popup-Panel sein. Das unterliegende Panel soll an den Seite durchsichtig sein nur nicht in der Mitte wo ich z.B. mit paintCompont ein gefülltes Rechteck zeichne.
groggy
1. November 2013 um 12:59
2
Es gibt ja scjon JPopupMenu, kannst du nicht das fuer dein Programm verwenden?
Pfff, kann am LayoutManager liegen, ich hab wirklich keine Ahnung gerade…
headnut
1. November 2013 um 13:08
3
Zeig doch mal dein code bitte
ohne code kann man dir grad nicht helfen…
system
2. November 2013 um 02:38
5
Hier ein kleines Test-Beispiel. Ja ich weiß, dass einige sich über das null-Layout aufregen werden und es abraten werden , aber nehmt es einfach so hin!
Also wie kann man diesen Code verändern, so dass die Komponenten nur an den Stellen wo mit paintComponent drüber gezeichnet wurde, nicht mehr zu sehen sind…
Das TextFeld sollte man danach aber zu Hälfte sehen können, also dort wo nicht mit paintComponent drüber gemalt wurde.
Java Code:
[ol]
[li]import java.awt.Color;[/li][li]import java.awt.Font;[/li][li]import java.awt.Graphics;[/li][li]import java.awt.event.KeyAdapter;[/li][li]import java.awt.event.KeyEvent;[/li][li]import java.awt.event.MouseEvent;[/li][li]import java.util.ArrayList;[/li][li]import javax.swing.JFrame;[/li][li]import javax.swing.JLabel;[/li][li]import javax.swing.JPanel;[/li][li]import javax.swing.JTextField;[/li][li]public class Fenster {[/li][li] private JFrame fenster;[/li][li] public Fenster() {[/li][li] fenster = new JFrame ();[/li][li] fenster.setSize(1200, 800);[/li][li] fenster.setDefaultCloseOperation(JFrame .EXIT_ON_CLOSE);[/li][li] fenster.setUndecorated(true);[/li][li] fenster.getContentPane().setBackground(new Color (41, 57, 85));[/li][li] fenster.setLocationRelativeTo(null);[/li][li] final PanelOne one = new PanelOne();[/li][li] one.setBounds(0, 0, 1200, 800);[/li][li] fenster.add(one);[/li][li] fenster.setVisible(true);[/li][li] }[/li][li] private class PanelOne extends Bottom {[/li][li] private JTextField field;[/li][li] private JLabel label;[/li][li] public PanelOne() {[/li][li] field = new JTextField ();[/li][li] field.setHorizontalAlignment(JTextField .CENTER);[/li][li] field.setForeground(Color .DARK_GRAY);[/li][li] field.setBounds(760, 400, 140, 23);[/li][li] add(field);[/li][li] label = new JLabel („Text scheint durch“);[/li][li] label.setForeground(Color .WHITE);[/li][li] label.setBounds(500, 450, 140, 23);[/li][li] add(label);[/li][/ol]
[ol]
[li] PanelTwo two = new PanelTwo();[/li][li] two.setBounds(0, 0, 1200, 800);[/li][li] add(two);[/li][li] }[/li][li] }[/li][li] private class PanelTwo extends Bottom {[/li][li] public void paintComponent(Graphics g) {[/li][li] g.setColor(Color .GRAY);[/li][li] g.fillRect(350, 200, 500, 500);[/li][li] }[/li][li] }[/li][li] private abstract class Bottom extends JPanel {[/li][li] public Bottom() {[/li][li] super ();[/li][li] setLayout(null);[/li][li] setBounds(0, 0, 1200, 800);[/li][li] setOpaque(false);[/li][li] }[/li][li] }[/li][li] public static void main(String [] args) {[/li][li] new Fenster();[/li][li] }[/li][li]}[/li][/ol]
In der paintCopoment() mussvin die erste zeile:
super.paintComponent(g);
*** Edit ***
Und wenn du sowieso nur ein rect malst reicht auch ein setBackground aber ich geh mal davon aus das es nur beim test so ist…
*** Edit ***
Und ausserdem: erst alle komponente hinzufuegen und dann framevisible machen
headnut
2. November 2013 um 03:16
7
und
pack();
fehlt auch noch vor setVisible()
groggy
2. November 2013 um 03:30
8
Was du noch machen kannst ist bei paintComponent anstatt public protected zu nehmen
Pack muss nicht unbedingt sein.
system
2. November 2013 um 04:51
10
super.paintComponent(g);
bringt nichts sehe keine Auswirkungen
pack() ist sowieso sinnlos ist ja auch null layout
und das Problem ist geblieben. Hat jemand noch eine Idee wie man das lösen kann?
system
2. November 2013 um 05:42
11
private JTextField field;
private JLabel label;
public PanelOne() {
field = new JTextField();
field.setHorizontalAlignment(JTextField.CENTER);
field.setForeground(Color.DARK_GRAY);
field.setBounds(760, 400, 140, 23);
label = new JLabel("Text scheint durch");
label.setForeground(Color.WHITE);
label.setBounds(500, 450, 140, 23);
PanelTwo two = new PanelTwo();
two.setBounds(0, 0, 1200, 800);
add(label);
add(two);
add(field);
}
@Override
public boolean isOptimizedDrawingEnabled() {
return false;
}
}```
Änderungen: Reihenfolge der add-Aufrufe und isOptimizedDrawingEnabled überschrieben.
Ich probiers mal aus wenn ich zuhause bin.
system
2. November 2013 um 05:55
13
Nachtrag:
Wenn das Label auch noch verdeckt werden soll, dann eben an anderer Stelle adden oder z order explizit setzen. Vielleicht interssant: JLayeredPane .
bERt0r
2. November 2013 um 06:19
14
Ich rate mal: Du willst einen Text haben, der über einem Farbigen Rechteck erscheint.
public class JavaNones extends JFrame {
private JLayeredPane contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JavaNones frame = new JavaNones();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public JavaNones() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JLayeredPane();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JPanel panel = new JPanel();
panel.setBackground(Color.RED);
panel.setBounds(152, 0, 157, 136);
contentPane.add(panel,JLayeredPane.DEFAULT_LAYER);
JLabel lblTextScheintDurch = new JLabel("Text scheint durch");
lblTextScheintDurch.setBounds(180, 10, 89, 14);
contentPane.add(lblTextScheintDurch,JLayeredPane.POPUP_LAYER);
}
}
system
2. November 2013 um 06:44
15
Beim meinem Anwendungsbeispiel klappt es danke
system
2. November 2013 um 06:45
16
Also die Methode von papoy
system
2. November 2013 um 06:50
17
Also die Methode von papoy
*** Edit ***
Also die Methode von papoy
*** Edit ***
@bERt0r
Nein ich wollte das der Text auf dem anderen JPanel nicht durchscheint. Hat sich jetzt aber geklärt
Waere nett wenn du deine loesung fuer andere auch mitteioen koenntest.
Du glaubst nicht wie viele leute am tag soetwas googeln…