2015-07-16 2 views
1

Я работаю с JPanel с именем infoPanel в предоставленном коде, что я хочу иметь возможность точно разместить JTextField с JLabel перед ним. Я попытался добавить JLabel к нему и не смог разместить там, где я хочу. Я хочу поставить его примерно на 20 пикселей ниже, чем в предоставленном коде, и перед ним я хочу добавить JTextField. Я также хотел бы сделать только JTextField.JTextField пошив одежды

  1. Как я могу точно разместить JTextField и JLabels?

  2. Какова наилучшая практика для этого?

    import javax.swing.*; 
    import java.awt.*; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.MouseAdapter; 
    import java.awt.event.MouseEvent; 
    import java.awt.geom.Ellipse2D; 
    import java.util.*; 
    import java.util.List; 
    
    @SuppressWarnings("serial") 
    public class DrawPanelMain extends JPanel { 
    
    private static final int PREF_W = 1200; 
    private static final int PREF_H = 700; 
    private List<Point> POINT_LIST = Arrays.asList(new Point[] { 
         new Point(40, 40), 
         new Point(40, 100), 
         new Point(40, 160), 
         new Point(40, 220), 
         new Point(40, 280), 
         new Point(40, 340), 
         new Point(40, 400), 
         new Point(40, 460), 
         new Point(40, 520), 
         new Point(40, 580), 
         new Point(100, 100), 
         new Point(100, 160), 
         new Point(100, 220), 
         new Point(100, 280), 
         new Point(100, 340), 
         new Point(100, 400), 
         new Point(100, 460), 
         new Point(100, 520), 
         new Point(100, 580), 
         new Point(160, 160), 
         new Point(160, 220), 
         new Point(160, 280), 
         new Point(160, 340), 
         new Point(160, 400), 
         new Point(160, 460), 
         new Point(160, 520), 
         new Point(160, 580), 
         new Point(220, 220), 
         new Point(220, 280), 
         new Point(220, 340), 
         new Point(220, 400), 
         new Point(220, 460), 
         new Point(220, 520), 
         new Point(220, 580), 
         new Point(280, 280), 
         new Point(280, 340), 
         new Point(280, 400), 
         new Point(280, 460), 
         new Point(280, 520), 
         new Point(280, 580), 
         new Point(340, 340), 
         new Point(340, 400), 
         new Point(340, 460), 
         new Point(340, 520), 
         new Point(340, 580), 
         new Point(400, 400), 
         new Point(400, 460), 
         new Point(400, 520), 
         new Point(400, 580), 
         new Point(460, 460), 
         new Point(460, 520), 
         new Point(460, 580), 
         new Point(520, 520), 
         new Point(520, 580), 
         new Point(580, 580) 
    }); 
    private JTabbedPane tabbedPane = new JTabbedPane(); 
    private int tabIndex = 0; 
    
    public DrawPanelMain() { 
        JPanel btnPanel = new JPanel(); 
        JPanel infoPanel = new JPanel(); 
        btnPanel.add(new JButton(new AddSwitchAction("Add Switch Panel"))); 
        btnPanel.add(new JButton(new PushConfigAction("Push Config"))); 
        btnPanel.add(new JButton(new ActivateAllAction("Activate All"))); //Button I want to work with 
        infoPanel.add(new JTextField(20)); 
    
        setLayout(new BorderLayout()); 
        add(tabbedPane, BorderLayout.CENTER); 
        add(btnPanel, BorderLayout.PAGE_END); 
        add(infoPanel, BorderLayout.EAST); 
    } 
    
    @Override 
    public Dimension getPreferredSize() { 
        if (isPreferredSizeSet()) { 
         return super.getPreferredSize(); 
        } 
        return new Dimension(PREF_W, PREF_H); 
    } 
    
    private class AddSwitchAction extends AbstractAction { 
         public AddSwitchAction(String name) { 
          super(name); 
          int mnemonic = (int) name.charAt(0); 
          putValue(MNEMONIC_KEY, mnemonic); 
         } 
    
        @Override 
        public void actionPerformed(ActionEvent e) { 
         tabIndex++; 
         String title = "Switch " + tabIndex; 
         DrawPanel2 tabComponent = new DrawPanel2(POINT_LIST); 
         tabbedPane.add(title, tabComponent); 
        } 
    } 
    
    private class PushConfigAction extends AbstractAction { 
        public PushConfigAction(String name) { 
         super(name); 
         int mnemonic = (int) name.charAt(0); 
         putValue(MNEMONIC_KEY, mnemonic); 
        } 
    
        @Override 
        public void actionPerformed(ActionEvent e) { 
         /*Add code sending the configuration to the switch panel*/ 
         JOptionPane.showMessageDialog(DrawPanelMain.this, "Configuration Pushed to Panel"); 
        } 
    } 
    
    private class ActivateAllAction extends AbstractAction { 
        public ActivateAllAction(String name) { 
         super(name); 
         int mnemonic = (int) name.charAt(1); 
         putValue(MNEMONIC_KEY, mnemonic); 
        } 
    
        @Override 
        public void actionPerformed(ActionEvent e) { 
         Component comp = tabbedPane.getSelectedComponent(); 
         if (comp instanceof DrawPanel2) { 
          DrawPanel2 drawPanel = (DrawPanel2) comp; 
          drawPanel.activateAll(); 
         } 
        } 
    } 
    
    private static void createAndShowGui() { 
        DrawPanelMain mainPanel = new DrawPanelMain(); 
        final double version = 0.1; 
        JFrame frame = new JFrame("RF Connection Panel " + version); 
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
        frame.getContentPane().add(mainPanel); 
        frame.pack(); 
        frame.setLocationByPlatform(true); 
        frame.setVisible(true); 
    } 
    
    public static void main(String[] args) { 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          createAndShowGui(); 
         } 
        }); 
    } 
    
    } 
    
    @SuppressWarnings("serial") 
    class DrawPanel2 extends JPanel { 
    private static final int OVAL_WIDTH = 40; 
    private static final Color INACTIVE_COLOR = Color.RED; 
    private static final Color ACTIVE_COLOR = Color.green; 
    private List<Point> points; 
    private List<Ellipse2D> ellipses = new ArrayList<>(); 
    private Map<Ellipse2D, Color> ellipseColorMap = new HashMap<>(); 
    
    public DrawPanel2(List<Point> points) { 
        this.points = points; 
        for (Point p : points) { 
         int x = p.x - OVAL_WIDTH/2; 
         int y = p.y - OVAL_WIDTH/2; 
         int w = OVAL_WIDTH; 
         int h = OVAL_WIDTH; 
         Ellipse2D ellipse = new Ellipse2D.Double(x, y, w, h); 
         ellipses.add(ellipse); 
         ellipseColorMap.put(ellipse, INACTIVE_COLOR); 
        } 
    
        MyMouseAdapter mListener = new MyMouseAdapter(); 
        addMouseListener(mListener); 
        addMouseMotionListener(mListener); 
    } 
    
    @Override 
    protected void paintComponent(Graphics g) { 
        super.paintComponent(g); 
        Graphics2D g2 = (Graphics2D) g; 
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
          RenderingHints.VALUE_ANTIALIAS_ON); 
        for (Ellipse2D ellipse : ellipses) { 
         g2.setColor(ellipseColorMap.get(ellipse)); 
         g2.fill(ellipse); 
        } 
    } 
    
    private class MyMouseAdapter extends MouseAdapter { 
        @Override 
        public void mousePressed(MouseEvent e) { 
         for (Ellipse2D ellipse : ellipses) { 
          if (ellipse.contains(e.getPoint())) { 
           Color c = ellipseColorMap.get(ellipse); 
           c = (c == INACTIVE_COLOR) ? ACTIVE_COLOR : INACTIVE_COLOR; 
           ellipseColorMap.put(ellipse, c); 
          } 
         } 
         repaint(); 
        } 
    } 
    
    public void activateAll() { 
        for (Ellipse2D ellipse : ellipses) { 
         ellipseColorMap.put(ellipse, ACTIVE_COLOR); 
        } 
        repaint(); 
    } 
    } 
    
+0

* «Какая у вас лучшая практика?» * Используйте один или несколько менеджеров макетов, «Вставки» и «Граница» – MadProgrammer

+0

ОК. Я сделаю некоторое исследование по этим вопросам, спасибо. – feltersnach

+0

Кроме того, в вашем примере кода нет 'JLabel' ... – MadProgrammer

ответ

3

Как я могу точно поставить JTextField и компоненты JLabel?

Не сосредотачивайтесь на этом, сосредоточьтесь на том, чтобы поток пользовательского интерфейса был понятен и прост для пользователя.

Какова наилучшая практика для этого?

Используйте один или более подходящих менеджеров компоновки, Insets где менеджер компоновки поддерживает их и/или Border лет, где они не

Например ...

Label and field

JPanel fields = new JPanel(); 
fields.add(new JLabel("Hello: ")); 
fields.add(new JTextField(20)); 
fields.setBorder(new EmptyBorder(20, 2, 0, 2)); 

infoPanel.add(fields); 

См. Laying Out Components Within a Container и How to Use Borders для получения более подробной информации

+0

Прохладный! Еще раз спасибо – feltersnach

+0

Это всего лишь очень простой пример: вам может понадобиться использовать разные менеджеры макетов для достижения конечного результата после;) – MadProgrammer

+0

год Я знаю, но вы меня направили в правильном направлении. – feltersnach