ausgewählte Textstellen scheinen durch Dialog durch

Status
Nicht offen für weitere Antworten.

deim0s

Mitglied
Hallo,

ich hab folgendes kleines Problem.
Ich hab diverse Gui-Elemente u.A. eine JTable und ein paar Textfelder etc. außerdem diverse Dialoge (Internalframes) wie z.B. eine Suche, Einstellungen etc.
Alle Dialoge werden so gesteuert, dass sämtliche anderen Gui-Elemente deaktiviert werden. Erst wenn das Dialogfeld wieder geschlossen wird, wird der Rest auch wieder aktiviert.
Mein Problem nun:
Wenn ich nun in einem Textfeld oder der Jtable Text auswähle und danach einen Dialog öffne erscheint der markierte Text noch auf dem Dialogfeld. Verschiebe ich das Dialogfeld, dann verschwindet der Text auch sofort.


Java:
    public void showDialog(DialogConstants dialog){
        
        table.setEnabled(false);

        switch (dialog) {
        case IMPORT: activeJIF = importDialog;
        ...
        default: activeJIF = null;
        }

        activeJIF.setVisible(true);

        
        table.setEnabled(false);
        ...

        open = true;
        
    }

    public void hideDialog(){
        if(activeJIF != null){
            activeJIF.setVisible(false);
        }
                
        table.setEnabled(true);
        ...
        open = false;
    }
falls ihr noch andere stellen aus meinem Code wollt, lassts mich wissen. Wußte jetzt nichtgenau welche Stellen alle interessant wären.

Grüße und Danke schonmal
deim0s
 

deim0s

Mitglied
Meinst du damit, dass ich die paintComponent irgendwo überschreibe?
Nein, dass mach ich nicht.

Werd wohl von Grund auf mal suchen müssen und langsam die Gui neu zusammenbauen.
 

André Uhres

Top Contributor
Werd wohl von Grund auf mal suchen müssen und langsam die Gui neu zusammenbauen.
Ja, versuch ein kurzes, selbständiges und kompilierbares Beispiel zu machen. Wenn dieses Beispiel funktioniert, dann erweitere es schrittweise bis zum gewünschten Resultat. Wenn das Problem auftritt, dann weisst du wodurch und kannst es gezielt untersuchen und beheben [lassen].
 

deim0s

Mitglied
Also ein kleines Beispiel hab ich jetzt:

Das Hauptprogramm:
Java:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.beans.PropertyVetoException;

public class FrameDialog extends JFrame {

    public FrameDialog() {
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(500,500));
        
        String[] columnNames = {"First Name",
                                "Last Name",
                                "Sport",
                                "# of Years",
                                "Vegetarian"};

        Object[][] data = {
            {"Mary", "Campione",
             "Snowboarding", new Integer(5), new Boolean(false)},
            {"Alison", "Huml",
             "Rowing", new Integer(3), new Boolean(true)},
            {"Kathy", "Walrath",
             "Knitting", new Integer(2), new Boolean(false)},
            {"Sharon", "Zakhour",
             "Speed reading", new Integer(20), new Boolean(true)},
            {"Philip", "Milne",
             "Pool", new Integer(10), new Boolean(false)}
        };

        JTable table = new JTable(data, columnNames);
        table.setEnabled(false);
        table.setFocusable(false);
        table.getTableHeader().setEnabled(false);
        table.getTableHeader().setFocusable(false);

        SVDialog dialog = new SVDialog("Test", "Test");

        JPanel content = new JPanel();
        setContentPane(content);

        content.add(dialog);
        dialog.setVisible(true);

        JScrollPane scrollPane = new JScrollPane(table);
        content.add(scrollPane);
        
        //Display the window.
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        FrameDialog f = new FrameDialog();
    }
}

Meine zugehörige Dialogklasse
Java:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class SVDialog extends JInternalFrame {

    private static final long serialVersionUID = 1L;

    private JPanel contentJP;
    
    public SVDialog (String name, String borderName){
        super(name);
        this.setClosable(true);
        this.setPreferredSize(new Dimension(200,200));
        
        contentJP = new JPanel();

        if(!borderName.equals("")){
            contentJP.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), borderName));
        }
        
        this.setContentPane(contentJP);

        
        // Für ESC-Taste zum abbrechen
        final ActionListener listener = new ActionListener() {
            public final void actionPerformed(final ActionEvent e) {
                setVisible(false);
            }
        };

        final KeyStroke keyStroke =
            KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true);
        registerKeyboardAction(listener, keyStroke,
                JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    }

}

Mein Problem jetzt:
Wenn man das Dialogfenster über die tabelle schiebt und danach den Tabellenheader auswählt, wird die Tabelle wieder selektiert. Es soll aber nichts anderes aus der Gui ausgewählt werden können, außer das Dialogfeld.
 

André Uhres

Top Contributor
Versuch's mal so:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class FrameDialog extends JFrame {

    public FrameDialog() {
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(500, 500));
        String[] columnNames = {"First Name",
            "Last Name",
            "Sport",
            "# of Years",
            "Vegetarian"};
        Object[][] data = {
            {"Mary", "Campione",
                "Snowboarding", new Integer(5), new Boolean(false)},
            {"Alison", "Huml",
                "Rowing", new Integer(3), new Boolean(true)},
            {"Kathy", "Walrath",
                "Knitting", new Integer(2), new Boolean(false)},
            {"Sharon", "Zakhour",
                "Speed reading", new Integer(20), new Boolean(true)},
            {"Philip", "Milne",
                "Pool", new Integer(10), new Boolean(false)}
        };
        JTable table = new JTable(data, columnNames);
        JPanel content = new JPanel();
        setContentPane(content);
        JScrollPane scrollPane = new JScrollPane(table);
        content.add(scrollPane);
        //Display the window.
        pack();
        setVisible(true);
        SVDialog dialog = new SVDialog(this, "Test", "Test");
        dialog.setVisible(true);
    }

    public static void main(String[] args) {
        FrameDialog f = new FrameDialog();
    }
}

class SVDialog extends JDialog {

    private static final long serialVersionUID = 1L;
    private JPanel contentJP;

    public SVDialog(Frame owner, String name, String borderName) {
        super(owner, name, true);
        setSize(new Dimension(200, 200));
        setLocationRelativeTo(owner);
        contentJP = new JPanel();
        if (!borderName.equals("")) {
            contentJP.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), borderName));
        }
        setContentPane(contentJP);
        // Für ESC-Taste zum abbrechen
        KeyStroke stroke = KeyStroke.getKeyStroke("ESCAPE");
        Action actionListener = new AbstractAction() {

            public void actionPerformed(ActionEvent actionEvent) {
                setVisible(false);
            }
        };
        InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        inputMap.put(stroke, "ESCAPE");
        rootPane.getActionMap().put("ESCAPE", actionListener);

    }
}
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben