2013-06-12 3 views
-2

, когда я нажимаю на соседний два переключателя, затем линия, нарисованная между этими кнопками, устанавливает условия в моем коде, которую линия будет рисовать только при выборе двух горизонтальных или вертикальных переключателей, еще показывая ошибку сообщение ........... это работает для меня, но если я случайно нажму на два переключателя, он выкинет исключение, которое я не могу понять, пожалуйста, дайте некоторое указание на ответ, потому что я тоже начинаю ...... ...... и что это означает, что он показывает, когда я компилирую прог .......... Примечание: C: \ Users \ MUHAMMAD Umair \ Desktop \ ComponentLinkerTest.java использует непроверенные или небезопасные операции. Примечание: перекомпиляция с -Xlint: непроверенная для деталей.не понял действия перечислителя радиокнопки

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.*; 

/** 
* @see http://stackoverflow.com/a/12389479/909085 
*/ 

public class ComponentLinkerTest extends JComponent 
{ 
    // private Map<JComponent, JComponent> linked; 
    Map<JComponent, java.util.List<JComponent> > linked;// = new HashMap<>(); 
    int n=1; 
    public ComponentLinkerTest() 
    { 
     super(); 
     linked = new HashMap(); 
    } 
static JRadioButton[] button = new JRadioButton[25]; 
    public void gui() 
    { 
     setupLookAndFeel(); 

       JFrame frame = new JFrame(); 

       linker = new ComponentLinkerTest(); 
       frame.setGlassPane (linker); 
       linker.setVisible (true); 

       JPanel content = new JPanel(); 
       content.setLayout (new GridLayout (5, 5, 5, 5)); 
       content.setBorder (BorderFactory.createEmptyBorder (5, 5, 5, 5)); 
       frame.add (content); 

       int i; 
       for (i = 0; i < 25; i++) 
       { 
        // final JButton button = new JButton ("Button" + i); 
        button[i] = new JRadioButton(); 
         // panel.add(fontButtons[i]); 
        button[i].addActionListener (new ActionListener() 
        { 
          public void actionPerformed (ActionEvent e) 
          { 
            link ((JRadioButton) e.getSource()); 
          } 
        }); 
        content.add (button [i]); 
       } 

       frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocationRelativeTo (null); 
     frame.setVisible (true); 
    } 

    /*public void link (JComponent c1, JComponent c2) 
    { 
     linked.put (c1, c2); 
     repaint(); 
    }*/ 

    public void link (JComponent c1, JComponent c2) 
      { 
       if(linked.containsKey(c1)){ 
        linked.get(c1).add(c2); 
       }else{ 
       java.util.List<JComponent> list = new LinkedList<>(); 
       list.add(c2); 
       linked.put (c1, list); 
       } 
       repaint(); 
     } 

    /* protected void paintComponent (Graphics g) 
    { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint (RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     g2d.setPaint (Color.BLACK); 
     for (JComponent c1 : linked.keySet()) 
     { 
      Point p1 = getRectCenter (getBoundsInWindow (c1)); 
      Point p2 = getRectCenter (getBoundsInWindow (linked.get (c1))); 
      /* Stroke stroke = new BasicStroke(8//, 
       /*BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, 
       new float[] { 12, 12 }, 0); 
g2d.setStroke(stroke); 
      g2d.setColor(Color.RED); 
      g2d.drawLine (p1.x, p1.y, p2.x, p2.y); 
     } 
    }*/ 

    @Override 
    protected void paintComponent (Graphics g) 
      { 
       super.paintComponent(g); 
       Graphics2D g2d = (Graphics2D) g; 
       g2d.setRenderingHint (RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

       g2d.setPaint (Color.BLACK); 
       for (JComponent c1 : linked.keySet()) 
       { 
        for(JComponent c2 : linked.get(c1)){ 
        Point p1 = getRectCenter (getBoundsInWindow (c1)); 
        Point p2 = getRectCenter (getBoundsInWindow (c2)); 
        /* Stroke stroke = new BasicStroke(8//, 
         /*BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, 
         new float[] { 12, 12 }, 0); 
     g2d.setStroke(stroke);*/ 
       if(n==1) 
       { 
        g2d.setColor(Color.RED); 
        n=2; 
       } 
       else 
       { 
        g2d.setColor(Color.BLUE); 
        n=1; 
       } 
        g2d.drawLine (p1.x, p1.y, p2.x, p2.y); 
        } 
       } 
     } 

    private Point getRectCenter (Rectangle rect) 
    { 
     return new Point (rect.x + rect.width/2, rect.y + rect.height/2); 
    } 

    private Rectangle getBoundsInWindow (Component component) 
    { 
     return getRelativeBounds (component, getRootPaneAncestor (component)); 
    } 

    private Rectangle getRelativeBounds (Component component, Component relativeTo) 
    { 
     return new Rectangle (getRelativeLocation (component, relativeTo), 
       component.getSize()); 
    } 

    private Point getRelativeLocation (Component component, Component relativeTo) 
    { 
     Point los = component.getLocationOnScreen(); 
     Point rt = relativeTo.getLocationOnScreen(); 
     return new Point (los.x - rt.x, los.y - rt.y); 
    } 

    private JRootPane getRootPaneAncestor (Component c) 
    { 
     for (Container p = c.getParent(); p != null; p = p.getParent()) 
     { 
      if (p instanceof JRootPane) 
      { 
       return (JRootPane) p; 
      } 
     } 
     return null; 
    } 

    public boolean contains (int x, int y) 
    { 
     return false; 
    } 

    private static ComponentLinkerTest linker; 

    public static void main (String[] args) 
    { 
     ComponentLinkerTest ct = new ComponentLinkerTest(); 
     ct.gui(); 
    } 



    private static JRadioButton last = null; 

    private static void link (JRadioButton buton) 
    { 
     int a=0; 
     int i; 
     if (last == null) 
     { 
      last = buton; 
      System.out.println(last.getX()); 
     } 
     else 
     { 
      for(i=0 ;i<25 ;i++) 
      { 
       if(buton == button[i]) 
       { 
        if(button[i-1] == last || button[i+1]==last || button[i-5] == last || button[i+5]==last) 
        { 
          System.out.println("in cond"); 
          linker.link (last, buton); 
          buton.setSelected(false); 
          last.setSelected(false); 
          last = null; 
        } 
        else 
        { 
          System.out.println("out cond"); 
          buton.setSelected(false); 
          last.setSelected(false); 
          last = null; 
          JOptionPane.showMessageDialog(null,"Wrong position clicked "); 
        } 
        break; 
       } 
       else 
       { 
        System.out.println("button not found"); 
       } 
      } 

     } 
    } 

    private static void setupLookAndFeel() 
    { 
     try 
     { 
      UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch (ClassNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (InstantiationException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IllegalAccessException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (UnsupportedLookAndFeelException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

1) Пожалуйста, добавьте письмо в верхнем регистре в начале предложения. Также используйте капитал для слова I, аббревиатуры и аббревиатуры, такие как JEE или WAR. Это облегчает людям понимание и помощь. 2) Вы до сих пор не задавали вопрос (не говоря уже о конкретном, ответственном вопросе). Какой у Вас вопрос? 3) Не сжимайте все свои проблемы в один пост. Идея SO заключается в том, что каждый поток представляет собой один Q & A (SO не является «одной остановкой, исправьте свой код»). –

+0

Я получаю только «Исключение в потоке» AWT-EventQueue-0 «java.lang.ArrayIndexOutOfBoundsException», если я выбираю последнюю радиокнопку (нижний правый угол) в качестве второго параметра. – MadProgrammer

+0

Я сталкиваюсь с проблемой, которую я описал в описании, если у вас есть какое-то решение, тогда помогите, java - это новое для меня –

ответ

1

Вы не делают никакой проверки диапазона ...

Это будет вызывать исключение, если последняя кнопка является на последней строке, или вторая кнопка является одним из первых строк

if (button[i - 1] == last || button[i + 1] == last || button[i - 5] == last || button[i + 5] == last) 

Вы должны изменить ваши проверки, чтобы убедиться, что они не распространяются ниже (0) или за ее пределами (button.length - 1) ...

if ((i > 0 && button[i - 1] == last) || 
     (i < (button.length - 1) && button[i + 1] == last) || 
     (i > 5 && button[i - 5] == last) || 
     (i < (button.length - 1) && button[i - 5] == last)) { 

Обновлена ​​альтернативой

Хорошо, что if заявление делает мою голову ... так что я взял другую тактичность ...

В принципе, вместо этого, я нашел индекс каждой кнопки и рассчитал расстояние что каждая кнопка была друг от друга, они могут быть только 1 или 5 индексов, кроме ...

int lastIndex = indexOf(last); 
int currentIndex = indexOf(buton); 

int diff = Math.max(lastIndex, currentIndex) - Math.min(lastIndex, currentIndex); 
if (diff == 1 || diff == 5) { 
    System.out.println("in cond"); 
    linker.link(last, buton); 
    buton.setSelected(false); 
    last.setSelected(false); 
    last = null; 
} else { 
    System.out.println("out cond"); 
    buton.setSelected(false); 
    last.setSelected(false); 
    last = null; 
    JOptionPane.showMessageDialog(null, "Wrong position clicked "); 
} 

И метод indexOf ...

protected static int indexOf(JRadioButton btn) { 

    int index = -1; 
    for (int value = 0; value < button.length; value++) { 
     if (button[value].equals(btn)) { 
      index = value; 
      break; 
     } 
    } 

    return index; 

} 

В качестве побочного примечания я также остерегаюсь использования static. Это говорит о плохом дизайне

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