2014-10-22 3 views
2

У меня есть класс, который расширяет JFrame с десятью переключателями на нем, и я использовал множество JPanels и GridLayouts, чтобы помочь мне правильно разместить их. Я пытаюсь сделать так, чтобы при выборе комбинации переключателей программа нарисовала линию между каждой из переключателей в том порядке, в котором вы их выбрали. Однако я не могу заставить ничего появиться. Я не уверен, что если я не переопределяю правильный метод, если я должен использовать Graphics2D, если панели скрывают все, что я рисую ... желательно, я бы хотел, чтобы решение, которое меня не меняло JPanel или что-то в этом роде.Картина на JFrame

public void paintComponent(Graphics g) 
{ 
    super.update(g); 
    if(buttonsSelected>1) 
    { 
     g.setColor(new Color(0xE3, 0xC9, 0x39)); 
     for(int k=0;k>4&&lastButton[k+1]!=-1;k++) 
     { 
      g.drawLine(buttonTest[lastButton[k]].getX(), buttonTest[lastButton[k]].getY(), buttonTest[lastButton[k+1]].getX(), buttonTest[lastButton[k]].getY()); 
      System.out.println("Ole!"); 
     } 
    } 
} 

Кроме того, здесь является частью кода, я использую для рисования панелей

int j=0; 
    for(int k=0;k<10;k++) 
    { 
     buttonTest[k]=new JRadioButton(); 
     buttonTest[k].setActionCommand(Integer.toString(k)); 
     buttonTest[k].setToolTipText(powersDin[k]); 
     buttonTest[k].addActionListener(new GoddessListener()); 
     buttonTest[k].setEnabled(false); 
    } 
    buttonTest[0].setEnabled(true); 
    buttonTest[6].setEnabled(true); 
    buttonTest[9].setEnabled(true); 

    paneGrids[0]=new JPanel(); 
    paneGrids[0].setLayout(new GridLayout(1,7)); 
    paneGrids[0].add(new JLabel()); //adding a blank JLabel lets me pad out the empty cells I don't want to fill 
    paneGrids[0].add(new JLabel()); 
    paneGrids[0].add(new JLabel()); 
    paneGrids[0].add(buttonTest[j++]); 
    paneGrids[0].add(new JLabel()); 
    paneGrids[0].add(new JLabel()); 
    paneGrids[0].add(new JLabel()); 
+0

вы должны переопределить метод рисования каждого отдельного флажка! в противном случае они будут обновлять и удалять то, что вы нарисовали. –

+0

Я пытаюсь нарисовать линию между кнопками, а не на них точно. А также, когда я запускаю код, я должен получать «Оле!». на консоли, чего не происходит. –

+0

что «Оле!» показан не меня удивляет! Но флажок имеет прямоугольную область вокруг него! –

ответ

4

Вы должны использовать @Override аннотацию на вашем методе paintComponent. Вы увидите, что вы не переопределяете какой-либо метод на вашем JFrame. Это связано с тем, что paintComponent определен на JComponent, который JFrame не наследует. Поэтому ваш метод paintComponent никогда не вызывается.

Вместо того чтобы пытаться нарисовать на контейнере верхнего уровня (which should generally not be done), используйте JPanel для пользовательской картины.

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    // your custom painting 
} 

Использование JPanel не сложнее, просто позвоните yourFrame.setContentPane(yourCustomPanel);.

Если вы хотите нарисовать сверху детей вы можете переопределение paintрассудительно. paintComponent обязательно потянет за детей, потому что он предназначен для рисования компонента. paint будет нарисовать на все. Другим вариантом для рисования сверху детей является использование чего-то вроде стеклянной панели или JLayeredPane, с которыми труднее работать.

Вот MCVE, который демонстрирует, как делать что-то вроде, я думаю, что вы хотите сделать просто.

connective grid

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JCheckBox; 
import javax.swing.SwingUtilities; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Color; 
import java.awt.RenderingHints; 

import java.util.Map; 
import java.util.LinkedHashMap; 
import java.util.Iterator; 

class ConnectiveGrid implements Runnable { 
    static final int GRID_H = 5; 
    static final int GRID_W = 10; 

    Map<JCheckBox, Point> path; 
    GridPanel grid; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new ConnectiveGrid()); 
    } 

    @Override 
    public void run() { 
     JFrame frame = new JFrame("Connective Grid"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // (LinkedHashMap will maintain insertion order) 
     path = new LinkedHashMap<JCheckBox, Point>(); 

     grid = new GridPanel(); 
     ActionListener listener = new Listener(); 

     for(int i = 0; i < GRID_H * GRID_W; i++) { 
      JCheckBox check = new JCheckBox(); 
      check.addActionListener(listener); 
      grid.add(check); 
     } 

     frame.setContentPane(grid); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    class Listener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      Object sc = ae.getSource(); 
      if(!(sc instanceof JCheckBox)) { 
       return; 
      } 

      JCheckBox check = (JCheckBox)sc; 
      if(check.isSelected()) { 

       Dimension sz = check.getSize(); 
       Point pt = check.getLocation(); 

       pt.x += sz.width/2; 
       pt.y += sz.height/2; 

       // if the check box is selected 
       // put it and its associated point in the path 
       path.put(check, pt); 

      } else { 

       // else remove the check box and point 
       path.remove(check); 
      } 

      // prompt a clean repaint 
      grid.repaint(); 
     } 
    } 

    class GridPanel extends JPanel { 
     GridPanel() { 
      super(new GridLayout(GRID_H, GRID_W)); 
     } 

     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 

      // verify there are enough points to draw at least one line 
      if(path.size() < 2) { 
       return; 
      } 

      Graphics2D copy = (Graphics2D)g.create(); 
      copy.setPaint(Color.BLUE); 
      copy.setRenderingHint(
       RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON 
      ); 

      // iterate the path and paint line-by-line 
      Iterator<Point> it = path.values().iterator(); 
      Point prev = it.next(); 
      do { 
       Point next = it.next(); 

       copy.drawLine(
        prev.x, prev.y, 
        next.x, next.y 
       ); 

       prev = next; 
      } while(it.hasNext()); 

      copy.dispose(); 
     } 
    } 
} 
+0

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

+0

Я не понимаю, почему. У меня создалось впечатление, что вы только пытались рисовать на контейнере. – Radiodef

+0

Теперь он не отображает некоторые кнопки. Если я использую setEnable (false), не будет ли он рисовать их, или я делаю что-то неправильно? –

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