문제

만들 수 있는 방법이 있나요? JButton 버튼 내부의 이미지뿐만 아니라 자신만의 버튼 그래픽을 사용하시겠습니까?

그렇지 않은 경우 사용자 정의를 만드는 다른 방법이 있습니까? JButton 자바에서?

도움이 되었습니까?

해결책

제가 처음 Java를 배울 때 Yahtzee를 만들어야 했고, 모든 것을 하나의 그림에 그리는 대신 사용자 정의 Swing 구성 요소와 컨테이너를 만드는 것이 멋지다고 생각했습니다. JPanel.연장의 이점 Swing 물론 구성 요소에는 키보드 단축키 및 기타 접근성 기능에 대한 지원을 추가할 수 있는 기능이 있습니다. paint() 메소드는 예쁜 사진을 인쇄합니다.그러나 최선의 방법은 아닐 수도 있지만, 이것이 당신에게 좋은 출발점이 될 수 있습니다.

8/6 편집 - 이미지에서 명확하지 않은 경우 각 주사위는 클릭할 수 있는 버튼입니다.그러면 다음 위치로 이동됩니다. DiceContainer 아래에.소스 코드를 보면 각 Die 버튼이 해당 값에 따라 동적으로 그려지는 것을 볼 수 있습니다.

alt text
alt text
alt text

기본 단계는 다음과 같습니다.

  1. 확장되는 클래스 만들기 JComponent
  2. 상위 생성자 호출 super() 당신의 생성자에서
  3. 클래스 구현을 확인하십시오. MouseListener
  4. 이것을 생성자에 넣으세요:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. 다음 메서드를 재정의합니다.

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. 이 메서드를 재정의합니다.

    public void paintComponent(Graphics g)
    

버튼을 그릴 때 작업해야 하는 공간의 양은 다음과 같이 정의됩니다. getPreferredSize(), 가정 getMinimumSize() 그리고 getMaximumSize() 동일한 값을 반환합니다.나는 이것을 많이 실험하지 않았지만 GUI에 사용하는 레이아웃에 따라 버튼이 완전히 다르게 보일 수 있습니다.

그리고 마지막으로, 소스 코드.내가 놓친 것이 있을 경우를 대비해.

다른 팁

예, 가능합니다.Swing을 사용하는 주요 장점 중 하나는 추상 컨트롤을 쉽게 만들고 조작할 수 있다는 것입니다.

다음은 기존 JButton 클래스를 확장하여 텍스트 오른쪽에 원을 그리는 빠르고 더러운 방법입니다.

package test;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyButton extends JButton {

    private static final long serialVersionUID = 1L;

    private Color circleColor = Color.BLACK;

    public MyButton(String label) {
        super(label);
    }

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

        Dimension originalSize = super.getPreferredSize();
        int gap = (int) (originalSize.height * 0.2);
        int x = originalSize.width + gap;
        int y = gap;
        int diameter = originalSize.height - (gap * 2);

        g.setColor(circleColor);
        g.fillOval(x, y, diameter, diameter);
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        size.width += size.height;
        return size;
    }

    /*Test the button*/
    public static void main(String[] args) {
        MyButton button = new MyButton("Hello, World!");

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new FlowLayout());
        contentPane.add(button);

        frame.setVisible(true);
    }

}

재정의하여 페인트 구성요소 버튼의 내용은 변경될 수 있지만 테두리는 페인트테두리 방법.그만큼 getPreferredSize 또한 콘텐츠 변경 사항을 동적으로 지원하려면 메서드를 관리해야 합니다.글꼴 메트릭과 이미지 크기를 측정할 때는 주의가 필요합니다.

신뢰할 수 있는 컨트롤을 만드는 데 있어 위 코드는 올바른 접근 방식이 아닙니다.Swing에서는 크기와 색상이 동적이며 사용되는 모양과 느낌에 따라 달라집니다.심지어 기본값 금속 JRE 버전에 따라 모양이 변경되었습니다.구현하는 것이 좋을 것입니다. 추상버튼 Swing API에서 정한 지침을 준수합니다.좋은 출발점은 다음을 살펴보는 것입니다. javax.swing.LookAndFeel 그리고 javax.swing.UI관리자 클래스.

http://docs.oracle.com/javase/8/docs/api/javax/swing/LookAndFeel.html

http://docs.oracle.com/javase/8/docs/api/javax/swing/UIManager.html

LookAndFeel의 구조를 이해하는 것은 컨트롤을 작성하는 데 유용합니다.사용자 정의 모양과 느낌 만들기

언제든지 Synth의 룩앤필을 시험해 볼 수 있습니다.사용하려는 이미지와 함께 일종의 스타일시트 역할을 하는 xml 파일을 제공합니다.코드는 다음과 같습니다.

try {
    SynthLookAndFeel synth = new SynthLookAndFeel();
    Class aClass = MainFrame.class;
    InputStream stream = aClass.getResourceAsStream("\\default.xml");

    if (stream == null) {
        System.err.println("Missing configuration file");
        System.exit(-1);                
    }

    synth.load(stream, aClass);

    UIManager.setLookAndFeel(synth);
} catch (ParseException pe) {
    System.err.println("Bad configuration file");
    pe.printStackTrace();
    System.exit(-2);
} catch (UnsupportedLookAndFeelException ulfe) {
    System.err.println("Old JRE in use. Get a new one");
    System.exit(-3);
}

거기에서 평소처럼 JButton을 추가하세요.유일한 변경 사항은 setName(string) 메서드를 사용하여 xml 파일에서 버튼이 매핑되어야 하는 대상을 식별한다는 것입니다.

xml 파일은 다음과 같습니다.

<synth>
    <style id="button">
        <font name="DIALOG" size="12" style="BOLD"/>
        <state value="MOUSE_OVER">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
        <state value="ENABLED">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
    </style>
    <bind style="button" type="name" key="dirt"/>
</synth>

바인딩 요소는 매핑할 항목을 지정합니다(이 예에서는 이름 속성이 "dirt"로 설정된 모든 버튼에 해당 스타일을 적용합니다).

그리고 몇 가지 유용한 링크:

http://javadesktop.org/articles/synth/

http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html

나는 아마도 잘못된 방향으로 백만 마일을 갈 것입니다(그러나 나는 단지 젊습니다 :P).하지만 패널에 그래픽을 추가한 다음 그래픽 객체에 마우스 리스너를 추가하여 사용자가 그래픽에 있을 때 작업이 수행되도록 할 수는 없었습니다.

나는 초기 CS 수업 이후로 SWING 개발을 해본 적이 없지만, 그것이 내장되어 있지 않다면 그냥 상속받을 수도 있습니다. javax.swing.AbstractButton 그리고 자신만의 것을 만들어 보세요.기존 프레임워크와 함께 무언가를 연결하는 것은 매우 간단해야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top