2013-05-15 3 views
0

У меня есть JTabbedPane, и на каждой вкладке есть JTextPane.Совместное использование компонентов с несколькими контейнерами

Каждая JTextPane имеет всплывающее меню, но я хочу, чтобы все они делились тем же всплывающим меню. Зачем? Потому что, когда я переключаю вкладки, я хочу, чтобы одни и те же параметры были выделены для каждого всплывающего окна.

Как я могу это сделать? Я попытался добавить статический экземпляр PopupMenu к каждой панели, но когда я добавлю его в один, он исчезнет из других.

EDIT: В следующем SSCCE, когда флажок установлен на TabOne, он не проверяется на TabTwo , Я хочу, чтобы он был отмечен на вкладках BOTH. Все остальные параметры могут быть уникальными для каждой вкладки, за исключением этой.

SSCCE:

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.lang.reflect.InvocationTargetException; 

import javax.swing.*; 


public class Main { 

    public static void main(String[] Args) { 
     final Main M = new Main(); 

     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 

       @Override 
       public void run() { 
        JFrame F = new JFrame("SSCCE"); 
        JTabbedPane Pane = new JTabbedPane(); 
        Pane.addTab("TabOne", M.new DebugBox(500, 500)); 
        Pane.addTab("TabTwo", M.new DebugBox(500, 500)); 

        F.setLayout(new BorderLayout()); 
        F.add(Pane, BorderLayout.NORTH); 
        F.pack(); 
        F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        F.setVisible(true); 
       } 

      }); 
     } catch (InvocationTargetException | InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 


    public class DebugBox extends JTextPane { 

     private JScrollPane ScrollPane = null; 
     private final JPopupMenu Menu = new JPopupMenu(); 
     private static final long serialVersionUID = 7731036968185936516L; 

     public DebugBox(int Width, int Height) { 
      this.ScrollPane = new JScrollPane(this, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
      this.setPreferredSize(new Dimension(Width, Height)); 

      JCheckBoxMenuItem Debug = new JCheckBoxMenuItem(new AbstractAction() { 
       private static final long serialVersionUID = -336209978671944858L; 

       @Override 
       public void actionPerformed(ActionEvent e) { 
           //DO something here that affects ALL the DebugBoxes because they all share this Menu Option somehow :S 
           //Change name of this menu option, all instances have their names changed too. 
       } 
      }); 

      JMenuItem Copy = new JMenuItem(new AbstractAction() { 
       private static final long serialVersionUID = -6774461986513304498L; 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        DebugBox.this.copy(); 
       } 
      }); 

      JMenuItem Clear = new JMenuItem(new AbstractAction() { 
       private static final long serialVersionUID = -5567371173360543484L; 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        DebugBox.this.setText(null); 
       } 
      }); 

      JMenuItem SelectAll = new JMenuItem(new AbstractAction() { 
       private static final long serialVersionUID = -8792250195980016624L; 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        DebugBox.this.selectAll(); 
       } 
      }); 

      this.Menu.add(Copy); 
      this.Menu.add(Clear); 
      this.Menu.add(SelectAll); 
      this.Menu.add(Debug); 

      Copy.setText("Copy"); 
      Clear.setText("Clear"); 
      SelectAll.setText("Select All"); 
      Debug.setText("Show Debug Box"); 
      this.setEditable(false); 
      this.add(this.Menu); 

      this.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseReleased(MouseEvent e) { 
        if (e.isPopupTrigger()) { 
         DebugBox.this.Menu.show(DebugBox.this, e.getX(), e.getY()); 
        } 
       } 
      }); 
     } 
    } 
} 
+1

Можете ли вы предоставить [SSCCE] (http://sscce.org/), как ваша работа поток ... – MadProgrammer

+0

Можно создать дубликат: http://stackoverflow.com/вопросы/4620601/косяк-а-свинг-компонентный быть добавленный к нескольким-контейнерам. Не могли бы вы показать, как вы обрабатываете всплывающее меню в соответствии с @MadProgrammer. – Craig

+0

Готово написать быстрый и грязный SSCCE. Я только что редактировал сообщение. – Brandon

ответ

2

Если вы хотите поделиться объект, то вам нужно создать объект и передать объект в качестве параметра для ваших других классов. Что-то вроде:

JPopupMenu popup = createSharedPopupMenu(); 
Pane.addTab("TabOne", M.new DebugBox(500, 500, popup)); 
Pane.addTab("TabTwo", M.new DebugBox(500, 500, popup)); 

Затем вам нужно создать общие действия, которые будут работать с любым текстовым компонентом. DefaultEditorKit предоставляет некоторые из этих действий для вас:

public JPopupMenu createSharedPopupMenu() 
{ 
    JPopupMenu popup = new JPopupMenu() 

    JMenuItem copy = new JMenuItem(new DefaultEditorKit.CopyAction()); 
    popup.add(copy); 
    ... 

    return popup. 
} 

Если комплект редактора не обеспечивает действия для вас, то вам нужно создать свой собственный, и вы должны продлить TextAction вместо AbstractAction. Класс TextAction имеет метод, который возвращает текстовый компонент с фокусом. Таким образом, вы можете реализовать действие в общем виде.

Также вам не нужно использовать MouseListener для вызова всплывающего окна. Вы можете просто использовать следующий метод JComponent:

JComponent.setComponentPopupMenu(JPopupMenu popup) 
+0

Я обязательно проверю TextAction. Я не могу передать объект как параметр, потому что объект может содержаться только одним контейнером за раз. При добавлении ко второму контейнеру он удаляется из первого. :( – Brandon

+1

Это правильно, но popupmenu отображается только на одном компоненте за раз. Он не добавляется в Контейнер на постоянной основе. Все, что вы передаете, является ссылкой на компонент, чтобы всплывающее окно отображалось/скрытый по мере необходимости – camickr

+0

Лучший ответ! Я об этом не думал. Сначала я сделал статический окончательный PopUpMenu и добавил слушателя к каждому JTextArea, но этот ответ лучший. Я собираюсь переписать его в соответствии с этим ответом , – Brandon

Смежные вопросы