Ich möchte zwei verschieden Panels in einem Fenster anordnen, bei mir wird immer nur eines angezeigt. Ich habe folgende Dateien geschrieben:
TextPanel.java
beide benutzen noch Rahmen.java zur Ausführung
und nun versuchte ich, beide Panels in einer Datei KomponentenPanel.java mit dem GridBagLayout anzuordnen, doch das klappt nicht, es wird nur das TextPanel halb angezeigt.
und last but not least eine KomponentenPanelTest.java
so das wärs, ich weiß, dass ich noch blutiger Anfänger bin, dennoch meine Bitte, vielleicht nur ein Tipp, wie dieses Problem zu lösen wäre.[/code]
Code:
ImgPanel.java
package komponenten;
import javax.swing.*;
import java.awt.*;
/**
* Die Klasse MyPanel erbt von JPanel Eigenschaften und Methoden; dadurch können
* "Komponenten" der Klasse Component gezeichnet werden.
* @author (Leopold Kneidinger)
* @version (09.06.2007)
*/
public class ImgPanel extends JPanel
{
private Color[] farben = {Color.white, Color.black, Color.blue,
Color.red, Color.yellow, Color.cyan,
Color.lightGray, Color.magenta, Color.green, Color.darkGray};
private Image bild1;
private Image bild2;
private Image img;
int breite;
public ImgPanel()
{
//setBackground(farben[6]);
Toolkit kit = Toolkit.getDefaultToolkit();
MediaTracker tracker = new MediaTracker(this);
bild1 = kit.getImage(getClass().getResource("/komponenten/img/kreuz01.jpg"));
bild2 = kit.getImage(getClass().getResource("/komponenten/img/gandhi01.jpg"));
// Bilder beim Tracker anmelden
tracker.addImage(bild1, 0);
tracker.addImage(bild2, 1);
System.out.println(tracker.checkID(0));
// Ueberwachen
try{
tracker.waitForAll();
}
catch (InterruptedException exception){
System.err.println("Kann das Bild nicht lesen");
}
}
public void setBreite(int br){
breite = br;
}
public void paintComponent (Graphics grafik)
{
super.paintComponent(grafik);
// Die Bildbreiten bestimmen
int seitenlaenge = bild1.getWidth(this);
// Position der Bilder auf der y-Achse festlegen
int yabstand = 0;
for(int zeile=0; zeile<breite; ++zeile){
// jeweilige Position auf der x-Achse
// muss am Zeilenanfang immer 0 sein;
int xabstand = 0;
for(int spalte=0; spalte<breite; ++spalte){
if((zeile-spalte) == 0 || (zeile+spalte) == breite-1)
grafik.drawImage(bild2, xabstand, yabstand, this);
else
grafik.drawImage(bild1, xabstand, yabstand, this);
xabstand += seitenlaenge;
}
yabstand += seitenlaenge;
}
/*
grafik.drawImage(bild2, 0, 0, this);
grafik.drawImage(bild1, 60, 0, this);
grafik.drawImage(bild1, 120, 0, this);
grafik.drawImage(bild2, 180, 0, this);
*/
}
}
TextPanel.java
Code:
package komponenten;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TextPanel extends JPanel implements ActionListener{
private JButton ersetzKnopf;
private JTextArea textArea;
private JTextField was;
private JTextField durch;
public TextPanel(){
setLayout(new FlowLayout(3));
add(new JLabel("Ersetze"));
add(was = new JTextField("", 8));
add(new JLabel("durch"));
add(durch = new JTextField("", 8));
add(ersetzKnopf = new JButton("ERSETZEN"));
ersetzKnopf.addActionListener(this);
add(textArea = new JTextArea(2,40));
textArea.setBounds(0, 50, 100,0);
textArea.setText ("Ersetze ... durch ... ");
}
public void actionPerformed(ActionEvent er){
//Object quelle = er.getSource();
String ws = textArea.getSelectedText();
if (ws == null)
ws = was.getText();
else
was.setText(ws);
int len = ws.length();
if (len == 0) return;
int pos = textArea.getText().indexOf(ws);
if (pos >= 0) {
textArea.replaceRange(durch.getText(), pos, pos+len);
}
}
}
beide benutzen noch Rahmen.java zur Ausführung
Code:
package komponenten;
import javax.swing.*;
import java.awt.*;
/**
* Die Klasse Rahmen erbt von JFrame, legt die Grösse fest
* setzt den Titel und ein Icon und zentriert das Fenster in
* der Mitte des Bildschirms.
* @author Leopold Kneidinger
*/
public class Rahmen extends JFrame{
private int breite, hoehe;
private Image img;
private Toolkit kit;
public Rahmen(String titel, int b, int h)
{
int rand = 8;
breite = b + rand;
hoehe = h + 4*rand;
setTitle(titel);
setSize(breite, hoehe);
setLocationRelativeTo(null);
kit = Toolkit.getDefaultToolkit();
img = kit.getImage(getClass().getResource("/komponenten/img/gandhi01.jpg"));
setIconImage(img);
}
/*
public static void main(String[] args)
{
Rahmen frame = new Rahmen("Bilderrahemen", 540, 540);
frame.setLocationRelativeTo(null);
Container inhaltsEb = frame.getContentPane();
ImgPanel p = new ImgPanel();
p.setBreite(9);
inhaltsEb.add(p);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//frame.pack();
frame.setVisible(true);
}
*/
}
und nun versuchte ich, beide Panels in einer Datei KomponentenPanel.java mit dem GridBagLayout anzuordnen, doch das klappt nicht, es wird nur das TextPanel halb angezeigt.
Code:
package komponenten;
import java.awt.*;
import javax.swing.*;
public class KomponentenPanel extends JPanel{
Label titel;
public KomponentenPanel(){
titel = new Label ("KomponentenPanel");
GridBagLayout gbl = new GridBagLayout ( ); // Erzeugen eines GridBag Objekts
GridBagConstraints gbc = new GridBagConstraints(); // Erzeugen der Constraints
setLayout(gbl); // Layout für den Panel setzen
gbc.anchor = GridBagConstraints.NORTH; // Ausrichtung: Oben
gbc.gridwidth = GridBagConstraints.REMAINDER; // Komponente ist letzte in der Reihe
gbc.gridx = 0;
gbc.gridy = 0;
add (titel, gbc);
ImgPanel imgP = new ImgPanel();
imgP.setBreite(6);
gbc.anchor = GridBagConstraints.NORTH;
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(imgP, gbc);
TextPanel textP = new TextPanel();
gbc.anchor = GridBagConstraints.SOUTH;
gbc.gridx = 0;
gbc.gridy = 2;
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(textP, gbc);
}
}
und last but not least eine KomponentenPanelTest.java
Code:
package komponenten;
import java.awt.Container;
import javax.swing.JFrame;
public class KomponentenPanelTest {
/**
* @param args
*/
public static void main(String[] args) {
Rahmen frame = new Rahmen("Text ersetzen", 500, 800);
Container inhaltsEb = frame.getContentPane();
KomponentenPanel kp = new KomponentenPanel();
//ImgPanel p2 = new ImgPanel();
//p2.setBreite(9);
inhaltsEb.add(kp);
//inhaltsEb.add(p2);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
so das wärs, ich weiß, dass ich noch blutiger Anfänger bin, dennoch meine Bitte, vielleicht nur ein Tipp, wie dieses Problem zu lösen wäre.[/code]