Создание пользовательского интерфейса в стиле Outlook в Java? - PullRequest
2 голосов
/ 18 февраля 2010

Я хочу создать пользовательский интерфейс в стиле Outlook в настольном приложении Java со списком контекстов или узлов на левой панели и выбранным контекстом на панели справа.Как мне это сделать?

Я ищу немного больше деталей, чем «использовать JFrame».Было бы хорошо учебник или обзор, или некоторый скелетный код, или фреймворк / библиотека, которая предоставляет такие вещи из коробки.

Спасибо.

Редактировать

Мой (отредактированный) код на данный момент:

UIPanel

public class UIPanel extends javax.swing.JPanel {

    private final JSplitPane splitPane;

    public UIPanel() {
        super(new BorderLayout());
        initComponents();

        JPanel contextPnl = new ContextPanel();
        JPanel treePnl = new NodePanel(contextPnl);

        this.splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
          true, new JScrollPane(treePnl), new JScrollPane(contextPnl));

        add(splitPane, BorderLayout.CENTER);

        //not sure I need these?
        splitPane.setVisible(true);
        treePnl.setVisible(true);
        contextPnl.setVisible(true);
}

NodePanel

public class NodePanel extends javax.swing.JPanel {

    JPanel _contextPanel;

    public NodePanel(JPanel contextPanel) {
        initComponents();
        _contextPanel = contextPanel;
        initialise();
    }

    private void initialise(){
        nodeTree.addTreeSelectionListener(getTreeListener());
    }

    private TreeSelectionListener getTreeListener(){
        return new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent e) {
                DefaultMutableTreeNode node = (DefaultMutableTreeNode)
                               nodeTree.getLastSelectedPathComponent();
            // if nothing is selected
            if (node == null)
                return;

        // get selected node
        Object nodeInfo = node.getUserObject();

        CardLayout layout = (CardLayout) _contextPanel.getLayout();
        //layout.show(_contextPanel, "test"); //show context for selected node

        }
    };
}

ContextPanel

public class ContextPanel extends javax.swing.JPanel {

    JPanel _cards;
    final static String CONTEXT1 = "Context 1";
    final static String CONTEXT2 = "Context 2";
    JPanel _context1;
    JPanel _context2;


    public ContextPanel() {
        initComponents();
        intialiseContexts();
    }

    public void updateContext(String contextName){
        //TODO
    }

    private void intialiseContexts(){
        _context1 = new NodeContext();
        _context2 = new NodeContext();
        _cards = new JPanel(new CardLayout());
        _cards.add(_context1, CONTEXT1);
        _cards.add(_context2, CONTEXT2);
}

Ответы [ 2 ]

3 голосов
/ 18 февраля 2010

Ключевой концепцией здесь является определение JSplitPane в качестве верхнего уровня Component с горизонтальным разделением. Левая часть разделенной панели становится вашим «древовидным» видом, а правая часть является контекстной панелью.

Хитрость заключается в том, чтобы использовать CardLayout для вашей контекстной панели и зарегистрировать TreeSelectionListener на JTree панели дерева, чтобы при выборе узла дерева вызывался метод CardLayout show. для того, чтобы обновить то, что в данный момент показывает контекстная панель. Вам также нужно добавить различные компоненты в контекстную панель, чтобы этот подход работал.

public class UIPanel extends JPanel {
  private static final String BLANK_CARD = "blank";
  private final JSplitPane splitPane;

  public UIPanel() {
    super(new BorderLayout());

    JPanel treePnl = createTreePanel();
    JPanel contextPnl = createContextPanel();

    this.splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
      true, new JScrollPane(treePnl), new JScrollPane(contextPnl));

    add(splitPane, BorderLayout.CENTER);
  }
}

РЕДАКТИРОВАТЬ: Пример использования

public class Main {
  public static void main(String[] args) {
    // Kick off code to build and display UI on Event Dispatch Thread.
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        JFrame frame = new JFrame("UIPanel Example");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());

        // Add UIPanel to JFrame.  Using CENTER layout means it will occupy all
        // available space.
        frame.add(new UIPanel(), BorderLayout.CENTER);

        // Explicitly set frame size.  Could use pack() instead.
        frame.setSize(800, 600);

        // Center frame on the primary display.
        frame.setLocationRelativeTo(null);

        // Finally make frame visible.
        frame.setVisible(true);
      }
    });
  }
}

Дополнительные советы

  • Я вижу, что вы создали отдельные классы для NodePanel и ContextPanel. Учитывая простоту этих классов и их тесную связь, вероятно, имеет больше смысла встраивать все компоненты пользовательского интерфейса непосредственно в UIPanel и иметь служебные методы, которые создают две подпанели. Если вы продолжаете использовать NodePanel и ContextPanel, попробуйте сделать их закрытыми, а не общедоступными.

  • Подход CardLayout хорошо работает, если у вас есть небольшое количество узлов, и вы знаете их заранее (и, следовательно, можете заранее добавить их соответствующие Компоненты в CardLayout). Если нет, вы должны рассмотреть вашу контекстную панель просто используя BorderLayout, и всякий раз, когда вы щелкаете по узлу, вы просто добавляете соответствующий компонент узла в положение BorderLayout.CENTER на NodePanel и вызываете панель. выполнить его макет снова. Причина, по которой я использовал CardLayout в прошлом, заключается в том, что мои узлы должны помнить только одну часть информации: имя карты. Однако, теперь я думаю об этом, я не вижу никаких реальных недостатков с этим другим подходом - на самом деле он, вероятно, более гибкий.

0 голосов
/ 18 февраля 2010

Возможно, вы захотите использовать платформу типа eclipse в качестве отправной точки. Он предоставляет очень богатую среду для создания этих приложений, поэтому вам не нужно начинать все с нуля. Онлайн-справочники и справка очень хороши, и есть несколько книг на эту тему.

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