Hallo liebes Java-Forum!
Ich beschäftige mich nun seit einigen Tagen mit der Erstellung von GUI's in Java mit Swing und bin nun auf folgendes Phänomen gestoßen, das ich mir nicht ganz erklären kann:
Wenn ich in einem JPanel paintComponent() überschreibe und darin die drawImage()-Methode eines Graphics-Objektes aufrufe, wird die Border des Panels nicht mehr angezeigt.
Ich habe daraufhin gelesen, dass die Border-Linien nicht außerhalb des Zeichenbereichs, sondern noch im Zeichenbereich selbst erstellt werden - vielleicht kommt es da dann ja zu Überlappungen von gezeichnetem Inhalt und der Rahmenlinie. Da ich aber ebenfalls gelesen habe, dass durch einen Aufruf von paint() zuerst paintComponent() und dann paintBorder() aufgerufen wird, dachte ich, dass der Rahmen eher den Inhalt überdeckt als umgekehrt. Nun habe ich trotzdem mal den Zielbereich von drawImage stark verkleinert, allerdings ohne Erfolg. Das Bild befindet sich wie erwartet ganz klein in der Mitte des vorgesehen Bereiches - die Rahmenlinie fehlt aber trotzdem.
Um das Problem der Überlappung 100%ig zu umgehen, habe ich das Draw-Panel zusätzlich noch in ein weiteres, deutlich größeres JPanel gepackt. Ohne den Aufruf von drawImage() sind beide Borderlines sichtbar und wie erwartet mit einem gewissen Abstand geschachtelt, mit dem Aufruf hingegen verschwinden beide Linien.
So, das war der ausführliche Bericht meienr Ansätze und Gedanken, nachfolgend poste ich den zugehörigen Code. Um Ratschläge und Anregungen wäre ich sehr dankbar!
Ich beschäftige mich nun seit einigen Tagen mit der Erstellung von GUI's in Java mit Swing und bin nun auf folgendes Phänomen gestoßen, das ich mir nicht ganz erklären kann:
Wenn ich in einem JPanel paintComponent() überschreibe und darin die drawImage()-Methode eines Graphics-Objektes aufrufe, wird die Border des Panels nicht mehr angezeigt.
Ich habe daraufhin gelesen, dass die Border-Linien nicht außerhalb des Zeichenbereichs, sondern noch im Zeichenbereich selbst erstellt werden - vielleicht kommt es da dann ja zu Überlappungen von gezeichnetem Inhalt und der Rahmenlinie. Da ich aber ebenfalls gelesen habe, dass durch einen Aufruf von paint() zuerst paintComponent() und dann paintBorder() aufgerufen wird, dachte ich, dass der Rahmen eher den Inhalt überdeckt als umgekehrt. Nun habe ich trotzdem mal den Zielbereich von drawImage stark verkleinert, allerdings ohne Erfolg. Das Bild befindet sich wie erwartet ganz klein in der Mitte des vorgesehen Bereiches - die Rahmenlinie fehlt aber trotzdem.
Um das Problem der Überlappung 100%ig zu umgehen, habe ich das Draw-Panel zusätzlich noch in ein weiteres, deutlich größeres JPanel gepackt. Ohne den Aufruf von drawImage() sind beide Borderlines sichtbar und wie erwartet mit einem gewissen Abstand geschachtelt, mit dem Aufruf hingegen verschwinden beide Linien.
So, das war der ausführliche Bericht meienr Ansätze und Gedanken, nachfolgend poste ich den zugehörigen Code. Um Ratschläge und Anregungen wäre ich sehr dankbar!
Java:
public class MyPanel extends JPanel{
BufferedImage buffImg;
Point upperLeft;
int width;
int height;
public MyPanel(){
super();
//load Image
File f = new File("images/test.jpg");
try {
buffImg = ImageIO.read(f);
} catch (IOException e) {
System.out.println("Datei konnte nicht geöffnet werden!");
}
// initial values
upperLeft = new Point(0,0);
width = buffImg.getWidth();
height = buffImg.getHeight();
repaint();
}
@Override
protected void paintComponent( Graphics g )
{
super.paintComponent(g);
int a = (int) upperLeft.getX();
int b = (int) upperLeft.getY();
int c = a+width;
int d = b+height;
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(buffImg,200,200,300,300,a,b,c,d, null);
g2.dispose();
}
}
public class Test {
public static void main(String[] args){
// frame
JFrame frame = new JFrame("test");
frame.setSize(1000, 1000);
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setLayout( new FlowLayout() );
//picPanel
MyPanel picPanel = new MyPanel();
picPanel.setPreferredSize(new Dimension(400,400));
picPanel.setBorder(BorderFactory.createTitledBorder("picPanel"));
//picBorderPanel
MyPanel picBorderPanel = new MyPanel();
picBorderPanel.setPreferredSize(new Dimension(500,500));
picBorderPanel.setBorder(BorderFactory.createTitledBorder("picBorderPanel"));
picBorderPanel.add(picPanel);
//buttonPanel
JPanel buttonPanel = new JPanel();
buttonPanel.setPreferredSize(new Dimension(500,500));
buttonPanel.setBorder(BorderFactory.createTitledBorder("buttonPanel"));
// adding components to top level container
Container contentPane = frame.getContentPane();
contentPane.add(picBorderPanel);
contentPane.add(buttonPanel);
// set visible
frame.pack();
frame.setVisible(true);
}
}