Не распознает конструктор шрифтов и общую конструкцию переключателя

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

Когда я пытаюсь скомпилировать, я получаю несколько ошибок о том, что "не удается найти символ... Font.PLAIN" Что-то не так с тем, как я использую шрифты?

Также в классе FontListener мне нужно передать группу кнопок, должен ли я передать группу кнопок через параметр в конструкторе?

Наконец, правильно ли я использую методы isSelected(), getSelection().getActionCommand? Класс FontFrame

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Font;

public class FontFrame extends JFrame {

    Font HelveticaFont = new Font("Helvetica", Font.PLAIN, 14);  
    Font TimesRomanFont = new Font("TimesRoman",Font.PLAIN, 14); 
    Font CourierFont = new Font("Courier", Font.PLAIN,14); 


    public FontFrame(String title){
        super(title);
    }

    public void init(){

    Container panel = this.getContentPane();
    panel.setLayout(new FlowLayout());
    JRadioButton Helvetica = new JRadioButton("Helvetica", true);
    JRadioButton TimesRoman = new JRadioButton("Times Roman", false);
    JRadioButton Courier = new JRadioButton("Courier", false);
    JTextField tf = new JTextField("Select One");
    panel.add(Helvetica);
    panel.add(TimesRoman);
    panel.add(Courier);
    panel.add(tf);

    ButtonGroup group = new ButtonGroup();
    group.add(Helvetica);
    group.add(TimesRoman);
    group.add(Courier);


    Helvetica.addItemListener(new FontListener(HelveticaFont, tf));
    TimesRoman.addItemListener(new FontListener(TimesRomanFont, tf));
    Courier.addItemListener(new FontListener(CourierFont, tf));

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
    this.setSize(300,200);
    this.setVisible(true);
    }
}

Класс FontListener

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class FontListener implements ItemListener {

    Font font;
    JTextField tf;

     public FontListener(Font f, JTextField tf){
        this.font = f;
        this.tf = tf;
     }

     public void itemStateChanged(ItemEvent event){
         if (Helvetica.isSelected()) {
            tf.setFont(font);
            tf.setText(group.getActionCommand());
         }
         else if (TimesRoman.isSelected()) {
            tf.setFont(font);
            tf.setText(group.getActionCommand());
        }   
        else if (Courier.isSelected()) {
            tf.setFont(font);
            tf.setText(group.getActionCommand());
        }
     }
 }

Основной класс

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Font{

    public static void main(String[] args){

        FontFrame window = new FontFrame("Fonts");
        window.init();
    }
}

Следуйте соглашениям об именах Java: имена переменных всегда пишутся в camelCase.

MC Emperor 18.02.2019 17:09

Вы В самом деле не должны вызывать свой собственный класс Font, потому что FontListener будет использовать его вместо java.awt.Font. Это даже не шрифт, поэтому так его и не назовешь.

Tom 18.02.2019 17:16

Читайте также: stackoverflow.com/questions/147454/…

Tom 18.02.2019 17:19

@Tom Тогда явный импорт import java.awt.Font; не решит проблему? Я предполагаю, что это так, и OP запускает старый код из-за других ошибок компиляции, но я бы предпочел убедиться, прежде чем голосовать...

Aaron 18.02.2019 17:26

@Aaron Когда OP явно импортирует этот класс, тогда да, это сработает, как вы можете видеть в FontFrame, где Font.PLAIN правильно распознан.

Tom 18.02.2019 17:30

У OP также есть проблемы с такими строками, как if (Helvetica.isSelected()), но здесь эта проблема связана с плохой областью видимости переменных.

Tom 18.02.2019 17:33

@Tom, единственные ссылки на Font.PLAIN находятся в классе FontFrame, поэтому я предполагаю, что ошибки if (Helvetica.isSelected()) помешали ему скомпилировать, и он запускает версию своего кода, в которой у него еще не было явного import java.awt.Font; в классе FontFrame, что объяснило бы ошибку cannot find symbol ... Font.PLAIN. Если я что-то пропустил? Как вы думаете, какой фрагмент кода вызывает эту ошибку?

Aaron 18.02.2019 17:52

Почему явный импорт имеет значение? Я не думал об этом, потому что думал, что awt.* будет таким же, как .font, в чем разница?

Edgar Smith 18.02.2019 18:00

@Aaron Аарон, я не знаю, какую версию OP на самом деле пытается скомпилировать, и действительно ли сообщение об ошибке, которое он написал, выдает их код, потому что в текущей форме: это не так. Проблемы исходят от FontListener и распространяются на FontFrame, но только там, где это пытается вызвать FontListener (поскольку FontFrame передает java.awt.Font, но FontListener ожидает Font).

Tom 18.02.2019 18:00

Эдгар, пожалуйста, прочитайте ответ в первой ссылке, он объясняет, почему это имеет значение.

Tom 18.02.2019 18:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
11
36
0

Другие вопросы по теме