Неподвижная форма JDialog Редактор ячеек JTable

Я настроил редактор ячеек JTable, чтобы разрешить ввод данных из кадра JDialog. Для этого я использовал редактируемое поле со списком, я добавил поле со списком ActionListener для отображения диалогового окна.

У меня есть видимый JDialog, но я хочу сделать его неподвижным, чтобы пользователь не мог его перемещать.

Вот мой код до сих пор,

package VIEW;

import VIEW.statManager.SearchProduitEvent;
import VIEW.statManager.SearchProduitEventListener;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.table.TableCellEditor;
import javax.swing.text.JTextComponent;


public class ProduitCellEditor extends AbstractCellEditor implements       TableCellEditor,ActionListener, SearchProduitEventListener {

    private JComboBox combo;
    private SearchProduitUi searchProduitUi;
    private String value = "value";
    public ProduitCellEditor() {

        combo = new JComboBox();
        combo.setEditable(true);
        combo.setActionCommand("combo");

        searchProduitUi = new SearchProduitUi();
        searchProduitUi.setSearchProduitEventListener(this);
        searchProduitUi.setSize(500,300);
        searchProduitUi.setLocationRelativeTo(combo);
    }


    @Override
    public Object getCellEditorValue() {
        return value;
     }

    @Override
    public Component getTableCellEditorComponent(JTable jtable, Object o, boolean bln, int i, int i1) {
        return combo;
     }


    public void actionPerformed(ActionEvent event) {
        Point comboPosition = combo.getLocationOnScreen();
         searchProduitUi.setLocationRelativeTo(combo);
         searchProduitUi.setLocation(comboPosition.x ,comboPosition.y + combo.getHeight());
         searchProduitUi.setVisible(true);

     }

    @Override
    public void searchDialogEventOccured(SearchProduitEvent ev) {
        value = ev.getProduit().getDesignation();
        fireEditingStopped();

      }
  }

person abdou amer    schedule 04.01.2015    source источник
comment
Сделать диалог неукрашенным...   -  person MadProgrammer    schedule 04.01.2015
comment
у меня есть searchProduitUi.setUndecorated(true); но ничего не происходит.   -  person abdou amer    schedule 04.01.2015
comment
[В случае семантики диалога] Обратите внимание, что я, как пользователь, хотел бы застрелить вас, если вы запретите мне перемещать окна, независимо от их типа. Достаточно часто случается так, что информация, необходимая для диалога, скрыта за диалогом, и если вы не позволите мне перемещать диалог... в большинстве оконных менеджеров я все еще мог бы переместить окно за диалогом, но на -коробка MS Windows, я бы потерялся. Итак, я думаю, что то, чего вы хотите достичь, может быть сомнительным с точки зрения удобства использования.   -  person Christian Hujer    schedule 05.01.2015
comment
[В случае семантики всплывающих окон] Если ваш диалог представляет собой временную вещь, а не настоящий диалог, подумайте, что если окно прокручивается или перемещается? Позиция вашего диалога больше не будет правильной. Вместо этого рассмотрите возможность использования JGlassPane.   -  person Christian Hujer    schedule 05.01.2015


Ответы (1)


JDialog#setUndecorated удалит украшения фрейма, в том числе элементы управления "закрыть/свернуть/развернуть", и сделает невозможным для пользователя перемещение окна.

введите здесь описание изображения

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class Test1 {

    public static void main(String[] args) {
        new Test1();
    }

    public Test1() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JPanel content = new JPanel(new GridBagLayout());
                content.setBorder(new EmptyBorder(8, 8, 8, 8));
                JLabel label = new JLabel("Hello world");
                content.add(label);

                JDialog dialog = new JDialog();
                dialog.setUndecorated(true);
                dialog.setTitle("Testing");
                dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                dialog.setContentPane(content);
                dialog.pack();
                dialog.setLocationRelativeTo(null);
                dialog.setVisible(true);
            }
        });
    }

}
person MadProgrammer    schedule 04.01.2015
comment
я получил эту маленькую ошибку. Исключение в потоке AWT-EventQueue-0 java.awt.IllegalComponentStateException: диалоговое окно отображается. - person abdou amer; 05.01.2015
comment
Ваше диалоговое окно уже было отображено на экране или прикреплено к собственному узлу (другие методы создают соединение с родным узлом), лучше всего сделать это, как только вы создадите экземпляр диалога, прежде чем делать что-либо еще - person MadProgrammer; 06.01.2015