2017-12-18 32 views
1

を選択します。円の異なるセグメントを選択する方法私は、ユーザーは、彼らが以前にそのセグメントの作成時に指定した今までに何をするために、異なるセグメントのいずれかを選択するためのボタンを押して上のポップアップうJavaを使用してウィンドウ内のセレクタを、ダイヤル/ホイールを作成していますサークルSegements

は、私は現在、私はカスタムレイアウトを使用して作成された円の周りのJLabelを有するが、そのインタラクティブ領域がテキストの周りに四角形に制限されている、とこだわっています。

どのようにしてこの領域を三角形/πセグメントに変更できますか?

これを達成するためのより良い方法はありますか?

ここでは、セグメント4に達成したい領域(青色で強調表示)がある画像を示します。

Wheel/Dial Example Image

+0

あなたはパネル自体にリスナーを登録し、クリックされた部門うまくする必要があります。 –

答えて

3

正直に言うと、あなたがこれを行う可能性がありますいくつかの方法があります。私が考えることができる最も簡単な方法の1つは、2D Graphics Shape APIを利用することです。

次の例は、単に簡単にするためにArc2Dを使用しますが、(あなたはそれが複雑に取得したい場合)一般的な概念は、同様にPathベースの形状のために働く必要があり

Highlight segment

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.geom.Arc2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private Arc2D segment; 

     private Arc2D selected = null; 

     public TestPane() { 
      segment = new Arc2D.Double(0, 0, 190, 190, -11.75, 23.5, Arc2D.PIE); 
      addMouseMotionListener(new MouseAdapter() { 
       @Override 
       public void mouseMoved(MouseEvent e) { 
        Point p = e.getPoint(); 
        p.translate(-5, -5); 
        selected = null; 
        if (segment.contains(e.getPoint())) { 
         selected = segment; 
        } 
        repaint(); 
       } 
      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.translate(5, 5); 
      if (selected != null) { 
       g2d.setColor(Color.BLUE); 
       g2d.fill(selected); 
      } 
      g2d.setColor(Color.RED); 
      g2d.draw(segment); 
      g2d.dispose(); 
     } 

    } 

} 

見てくださいWorking with Geometry詳細については、

+0

これは素晴らしいです!私は翻訳を削除し、それは完全に動作します。 – Daedric

+0

並進はちょうど私が私が図形の位置を定める好きではないようセグメントは、canteredなっているが、それは、私だけ – MadProgrammer

3

の場合はPiePlotとなる場合があります。ディストリビューションに含まれるPieChartDemo1から始まり、以下の変更により、以下に示すプロットが生成されます。 ChartMouseListenerは、マウスを動かすときに示されたセクションを強調表示します。

image

public static JPanel createDemoPanel() { 
    … 
    PiePlot plot = (PiePlot) chart.getPlot(); 
    PieDataset data = plot.getDataset(); 
    panel.addChartMouseListener(new ChartMouseListener() { 
     @Override 
     public void chartMouseMoved(ChartMouseEvent e) { 
      ChartEntity ce = e.getEntity(); 
      if (ce instanceof PieSectionEntity) { 
       for (int i = 0; i < data.getItemCount(); i++) { 
        plot.setExplodePercent(data.getKey(i), 0); 
       } 
       PieSectionEntity item = (PieSectionEntity) ce; 
       plot.setExplodePercent(item.getSectionKey(), 0.25); 
      } 
     } 
     @Override 
     public void chartMouseClicked(ChartMouseEvent e) {} 
    }); 
    return panel; 
} 
+1

はありがとうございます、これは面白いですが、私はMadProgrammerの答えは私が探しているものをより多くのだと思います。 – Daedric

関連する問題