2013-12-15 81 views
1

我有一個關於JFrame的問題列表。 我創建了一個幫助菜單按鈕。現在的事情是:帶有列表提供信息的JFrame

當點擊一個新的窗口應該彈出。在這個窗口中,我想用名字列出一些公式。點擊列表中的公式後,我想在同一個屏幕中顯示公式代表的內容。

它必須是類似左邊的公式,在可滾動列表中和在右邊的某個文本框右側的同一屏幕中描述點擊的公式。

有誰知道如何做到這一點?

menuItem = new JMenuItem("Help"); 
    menuItem.setMnemonic(KeyEvent.VK_H); 
    menuItem.addActionListener(new ActionListener() 
    { 
      public void actionPerformed(ActionEvent e) 
      { 

       JFrame help = new JFrame("HELP"); 
       help.setTitle("Help"); 
       help.setSize(400,200); 
       help.setLocationRelativeTo(null); 
       help.setDefaultCloseOperation(help.DISPOSE_ON_CLOSE); 
       help.setVisible(true); 
       help.add(label);    

       String labels[] = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "x", "y"}; 
       JList list = new JList(labels); 
       JScrollPane scrollPane = new JScrollPane (list); 

       Container contentPane = help.getContentPane(); 
       contentPane.add(scrollPane, BorderLayout.CENTER); 



      } 
    }); 
+0

你到目前爲止嘗試過什麼?編輯您的帖子並添加有效的代碼來展示您的問題。 – nachokk

回答

1

這裏有一個基本的實現。

如何第二(公式)窗口可能看起來像

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Window; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Vector; 

import javax.swing.JDialog; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JScrollPane; 
import javax.swing.SwingConstants; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class FormulaWindow extends JDialog { 

    public FormulaWindow(final Window parent) { 
     super(parent, "Formula window", ModalityType.MODELESS); 
     final Container cp = getContentPane(); 
     cp.setLayout(new BorderLayout()); 
     setSize(500, 400); 
     final Map<String, String> formulaDescritions = new HashMap<>(); 
     formulaDescritions.put("Formula 1", "<html>How the world works.</html>"); 
     formulaDescritions.put("Formula 2", "<html>How woman work.</html>"); 
     formulaDescritions.put("Formula 3", "<html>How programming works.</html>"); 
     final JList<String> formulaList = new JList<String>(new Vector<String>(formulaDescritions.keySet())); 
     formulaList.setPreferredSize(new Dimension(100, 100)); 
     final JLabel descriptionLabel = new JLabel(); 
     descriptionLabel.setVerticalAlignment(SwingConstants.TOP); 
     formulaList.addListSelectionListener(new ListSelectionListener() { 
      public void valueChanged(ListSelectionEvent evt) { 
       final JList<String> list = (JList<String>) evt.getSource(); 
       descriptionLabel.setText(formulaDescritions.get(list.getSelectedValue())); 
      } 
     }); 
     cp.add(new JScrollPane(formulaList), BorderLayout.WEST); 
     cp.add(new JScrollPane(descriptionLabel), BorderLayout.CENTER); 
    } 
} 

如何在主窗口打開它上的菜單項的選擇:

import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.SwingUtilities; 

public class MainWindow extends JFrame { 

    private class ShowFormulaWindowAction extends AbstractAction { 
     public ShowFormulaWindowAction() { 
      super("Show formulas..."); 
     } 

     public void actionPerformed(ActionEvent actionEvent) { 
      FormulaWindow formulaWindow = new FormulaWindow(MainWindow.this); 
      formulaWindow.setVisible(true); 
     } 
    } 

    public MainWindow() { 
     super("Main window"); 
     JMenu fileMenu = new JMenu("Extras"); 
     fileMenu.add(new JMenuItem(new ShowFormulaWindowAction())); 
     JMenuBar menuBar = new JMenuBar(); 
     menuBar.add(fileMenu); 
     setJMenuBar(menuBar); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    } 

    public static void main(final String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       MainWindow mainWindow = new MainWindow(); 
       mainWindow.setSize(350, 250); 
       mainWindow.setVisible(true); 
      } 
     }); 
    } 
} 

進一步筆記

次要勝利道瓊斯不應該是JFrame,而應該是JDialog。以這種方式

  • 它不顯示任務欄
  • 可以通過主窗口「擁有」的另一個圖標,致使該對話框會自動關閉,當所有者關閉
+0

是否可以將公式窗口中的主要內容?因爲點擊按鈕時必須發生這種情況。我正在製作一個電子表格程序,這個功能會在幫助下列出。 – user3105297

+0

@ user3105297:您可以將其移動到其他課程。我添加了一個如何將它集成到主應用程序窗口的示例。 –

+0

好的,謝謝。但是可以在我的ActionPerformed中調用FormulaWindow()嗎? – user3105297

5

建議:

  • 彈出應該是某種形式的對話,也許是一個非模態的JDialog幫助菜單。
  • 您應該使用CardLayout,以便它最初顯示公式名稱,可能位於由JScrollPane保存的JList中。
  • 當選擇JList項目時,通過CardLayout交換視圖並顯示相應的公式。

鏈接:

編輯
幽州的評論,

它必須是像我有我的公式左側滾動條,並在屏幕右側某種文本框與公式的描述。

這不應該有任何其他相關的信息和限制成爲你原來的問題的一部分嗎?如果我是你,我會編輯原文並提供所有必要的信息,以便我們能夠完全理解你的問題,包括相關的代碼(最好是sscce)。所以...

  • 使用另一個佈局管理器,例如GridLayout或更好的BorderLayout來允許您在另一個JPanel中顯示多個JPanel。我將留給你找到Swing佈局管理器教程的鏈接。
  • 您仍然可以使用CardLayout來交換顯示器JPanel上顯示的等式。

編輯2
關於你最新的代碼後:

  • 再次,對話窗口應該是的JDialog不是的JFrame。該窗口依賴於正在顯示它的窗口,因此不應該是獨立的應用程序窗口,如JFrame。
  • 我會將JScrollPane放置在BorderLayout.LINE_START位置和CardLayout中,使用方程式JPanel在BorderLayout.CENTER位置。
  • 您不必使用CardLayout。如果方程式只是基本文本,您可以簡單地更改JLabel的文本。
  • 或者如果圖像,然後交換JLabel的ImageIcon。
  • 或者,如果大量的文字,然後在不可編輯,不可聚焦的JTextArea

編輯3

文本有沒有辦法來設置大小爲固定大小的滾動窗格BorderLayout.LINE_START?

而不是試圖設置任何事物的大小,考慮調用你的JList的一些方法,方法等,setPrototypeCellValue(E prototypeCellValue)setVisibleRowCount(int visibleRowCount),這將使該組件基於合理的數據和初始假設設定自己的首選大小。請查看JList API瞭解這些和其他JList方法的詳細信息。

+0

它必須是像我有我的公式左側的滾動條,並在屏幕的右側某種文本框與公式的描述。 – user3105297

+0

好的,謝謝,讓我試試看! – user3105297

+0

有沒有辦法將大小設置爲滾動窗格BorderLayout.LINE_START的固定大小? – user3105297