Нужна помощь в понимании значения, возвращаемого методом getInsets () JButton

Первое, что вам нужно сделать, это убедиться, что файл существует. Для этого вам просто нужно попытаться открыть поток файлов на пути. После того, как вы открыли поток файлов, используйте stream.fail (), чтобы узнать, работает ли он, как ожидалось, или нет.

bool fileExists(string fileName)
{

ifstream test;

test.open(fileName.c_str());

if (test.fail())
{
    test.close();
    return false;
}
else
{
    test.close();
    return true;
}
}

Вы также должны убедиться, что указанный файл является правильным типом файла. Для этого вам нужно просмотреть путь к файлу, пока не найдете расширение файла. После того, как у вас есть расширение файла, убедитесь, что оно является CSV-файлом.

bool verifyExtension(string filename)
{
int period = 0;

for (unsigned int i = 0; i < filename.length(); i++)
{
    if (filename[i] == '.')
        period = i;
}

string extension;

for (unsigned int i = period; i < filename.length(); i++)
    extension += filename[i];

if (extension == ".csv")
    return true;
else
    return false;
}

Эта функция вернет расширение файла, которое будет использоваться позже в сообщении об ошибке.

string getExtension(string filename)
{
int period = 0;

for (unsigned int i = 0; i < filename.length(); i++)
{
    if (filename[i] == '.')
        period = i;
}

string extension;

if (period != 0)
{
    for (unsigned int i = period; i < filename.length(); i++)
        extension += filename[i];
}
else
    extension = "NO FILE";

return extension;
}

Эта функция фактически вызовет созданные выше проверки ошибок, а затем проанализирует файл.

void parseFile(string fileName)
{
    if (fileExists(fileName) && verifyExtension(fileName))
    {
        ifstream fs;
        fs.open(fileName.c_str());
        string fileCommand;

        while (fs.good())
        {
            string temp;

            getline(fs, fileCommand, '\n');

            for (unsigned int i = 0; i < fileCommand.length(); i++)
            {
                if (fileCommand[i] != ',')
                    temp += fileCommand[i];
                else
                    temp += " ";
            }

            if (temp != "\0")
            {
                // Place your code here to run the file.
            }
        }
        fs.close();
    }
    else if (!fileExists(fileName))
    {
        cout << "Error: The provided file does not exist: " << fileName << endl;

        if (!verifyExtension(fileName))
        {
            if (getExtension(fileName) != "NO FILE")
                cout << "\tCheck the file extension." << endl;
            else
                cout << "\tThere is no file in the provided path." << endl;
        }
    }
    else if (!verifyExtension(fileName)) 
    {
        if (getExtension(fileName) != "NO FILE")
            cout << "Incorrect file extension provided: " << getExtension(fileName) << endl;
        else
            cout << "There is no file in the following path: " << fileName << endl;
    }
}
2
задан AJo 20 February 2019 в 04:44
поделиться

2 ответа

1120 Хорошо, обо всем по порядку. Оба ваших вызова на button.getInsets() и getBorderInsets(button) идентичны , как вы видели в документации, и подтверждены источником (внутренне, getInsets() просто вызывает getBorderInsets(this) в любом случае).

Теперь, когда это не так, по умолчанию a JButton украшено CompoundBorder . Если вы посмотрите на источник , то увидите, что CompoundBorder, используемый для кнопок, состоит из:

  • внешней границы типа BasicBorders.ButtonBorder и
  • Внутренняя граница типа MarginBorder.

MarginBorder, вероятно, ваш интерес здесь. Он имеет переопределение для getBorderInsets() , которое возвращает поля компонента .

1123 Итак, в заключение, граница JButton на самом деле составлена ​​из ДВУХ границ. Фактические ограничивающие линии снаружи (которые вы обычно рассматривали бы как «границу», заставляя ее выглядеть трехмерной), плюс граница поля внутри. Поэтому, когда вы делаете setMargin(), вы также воздействуете на внутри части вашей составной границы.

Это объясняет ваш результат:

Кнопка Insets java.awt.Insets [top = 103 , слева = 13 , снизу = ] 13 , вправо = 13 ]

Внешние линии имеют ширину 3 px каждая, а ваше поле равно ( 100 , 10,10,10 ), предоставляя вам вышеуказанную общую вставку границы.

0
ответ дан NPras 20 February 2019 в 04:44
поделиться

Я думаю, что вы делаете это с помощью вставок компонентов. Так что назовите что-то вроде:

Insets insets = component.getInsets();
insets.set(top, left, bottom, right);

Вы должны сделать это после установки границы для компонента.

Insets - это простой класс, который содержит 4 поля: верхнее, левое, нижнее и правое. Вставки используются для описания заполнения, окружающего компонент. Ожидается, что каждая граница в Swing будет возвращать объект Insets, описывающий, сколько отступов добавить к компоненту для правильной визуализации Border.

Совет по разработке пользовательских компонентов Swing: значение Insets

0
ответ дан Chetan Joshi 20 February 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: