Hallo
hatte vor ein paar Tagen schonmal ein ähnlich gelagertes Problem, dieses konnte glücklicherweise durch einen Tipp gelöst werden. Hoffe das funktioniert hier auch so. Warscheinlich seh ich wieder nur den Wald vor lauter Bäumen nicht.
Problemschilderung:
Habe ein JFrame:
In diesem befindet sich ein Button, mit dem das JDialog geöffnet wird, und ein JPanel als eigene Klasse:
Der Button öffnet folgendes JDialog:
Mit dem OK Button möchte ich nun einfach ein zweites JTextPane neben das andere setzen. Es funktioniert, wenn ich diese Aktion auf den Button im JFrame setze. Aber warum aus dem JDialog heraus nicht? Die Syso-Anweisung ruft er aber auf, nur das Textfeld wird nicht dargstellt.
Habe gelesen, dass der JDialog das JFrame pausiert und somit keine Veränderungen zulässt. Abhilfe soll ein eigener Thread schaffen oder das setzen der Modalität auf false. Nun false war es sowieso und mit dem Thread hat es nicht geklappt (ist nicht im Minimalbeispiel enthalten).
hatte vor ein paar Tagen schonmal ein ähnlich gelagertes Problem, dieses konnte glücklicherweise durch einen Tipp gelöst werden. Hoffe das funktioniert hier auch so. Warscheinlich seh ich wieder nur den Wald vor lauter Bäumen nicht.
Problemschilderung:
Habe ein JFrame:
Java:
package gui;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class TestFrame extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private TestPane tp = new TestPane();
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TestFrame frame = new TestFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public TestFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
init();
}
private void init() {
JButton btnNewButton = new JButton("New button");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//contentPane.remove(1);
//tp.doSmth("test");
new TestDialog();
contentPane.updateUI();
}
});
contentPane.add(btnNewButton, BorderLayout.SOUTH);
contentPane.add(tp, BorderLayout.CENTER,1);
}
}
In diesem befindet sich ein Button, mit dem das JDialog geöffnet wird, und ein JPanel als eigene Klasse:
Java:
package gui;
import javax.swing.JPanel;
import javax.swing.JTextPane;
public class TestPane extends JPanel {
private static final long serialVersionUID = 1L;
public TestPane() {
initA();
}
private void initA() {
JTextPane txtPaneA = new JTextPane();
txtPaneA.setText("bla bla bla");
add(txtPaneA);
}
private void initB() {
//removeAll();
JTextPane txtPaneB = new JTextPane();
txtPaneB.setText("test test test test");
add(txtPaneB);
updateUI();
}
public void doSmth(String str) {
switch (str) {
case "test" :
initB();
System.out.println("initB() test");
break;
default:
break;
}
}
}
Der Button öffnet folgendes JDialog:
Java:
package gui;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class TestDialog extends JDialog{
private static final long serialVersionUID = 1L;
private final JPanel contentPanel = new JPanel();
private TestPane tp = new TestPane();
public TestDialog() {
init();
}
private void init() {
setBounds(100, 100, 450, 300);
getContentPane().setLayout(new BorderLayout());
contentPanel.setLayout(new FlowLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
setLocationRelativeTo(null);
setVisible(true);
setModal(false);
getContentPane().add(contentPanel, BorderLayout.CENTER);
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
getContentPane().add(buttonPane, BorderLayout.SOUTH);
JButton okButton = new JButton("OK");
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tp.doSmth("test");
}
});
okButton.setActionCommand("OK");
buttonPane.add(okButton);
getRootPane().setDefaultButton(okButton);
JButton cancelButton = new JButton("Cancel");
cancelButton.setActionCommand("Cancel");
buttonPane.add(cancelButton);
}
}
Mit dem OK Button möchte ich nun einfach ein zweites JTextPane neben das andere setzen. Es funktioniert, wenn ich diese Aktion auf den Button im JFrame setze. Aber warum aus dem JDialog heraus nicht? Die Syso-Anweisung ruft er aber auf, nur das Textfeld wird nicht dargstellt.
Habe gelesen, dass der JDialog das JFrame pausiert und somit keine Veränderungen zulässt. Abhilfe soll ein eigener Thread schaffen oder das setzen der Modalität auf false. Nun false war es sowieso und mit dem Thread hat es nicht geklappt (ist nicht im Minimalbeispiel enthalten).